【发布时间】:2013-02-02 09:07:09
【问题描述】:
class MyClass1
{
public:
MyClass1()
{
init();
}
virtual void init()
{
printf("MyClass1 init");
}
}
class MyClass2 : public MyClass1
{
public:
virtual void init()
{
printf("MyClass2 init");
}
}
int main()
{
MyClass2 *obj = new MyClass2();
return 0;
}
我希望这个结果
"MyClass2 init"
但它实际上显示了消息
"MyClass1 init"
如何从基类构造函数调用派生类虚方法?
=== 更新1 ===
class MyClass1
{
public:
MyClass1()
{
init();
}
virtual void init()
{
printf("MyClass1 init");
}
}
class MyClass2 : public MyClass1
{
public:
MyClass2()
: MyClass1()
{
}
virtual void init()
{
printf("MyClass2 init");
}
}
我希望 MyClass2 覆盖 MyClass1 初始化方法 但它仍然显示“MyClass1 init”
C++ 如何像 java/C# 覆盖方法一样工作?
=== 更新2 ===
class MyClass1
{
public:
MyClass1()
{
init(); <--- can't work like test method ???
}
void test()
{
init(); <--- work fine
}
virtual void init()
{
printf("MyClass1 init");
}
}
class MyClass2 : public MyClass1
{
public:
MyClass2()
: MyClass1()
{
}
virtual void init()
{
printf("MyClass2 init");
}
}
我知道 obj->init() 会调用 MyClass2::init。
但我希望 C++ 可以在 Constructor 方法中运行。
虽然 obj->init() 可以解决。
但是希望代码可以少写一点。
有些人忘记调用 init()。
Java/C# 可以少写多做。但是 C++ 不能……这很令人沮丧。
【问题讨论】:
-
从基类构造函数调用虚函数并不是一个非常明智的选择。为什么不能直接从派生的构造函数中调用派生的
init? -
做你想做的事有点违背多态性的目的。顺便说一句,
MyClass2的构造函数无论如何都会被调用。 -
你不能。派生类尚不存在,无法调用。
-
使用
Qt,您可以声明函数Q_INVOKABLE,并在构造函数完成时执行QMetaObject::invokeMethod调用它