我有这个代码:
A * a = new A;
a->fun();
delete a;
a = new B;
a->fun();
delete a;
我需要做的是让它打印:
A::fun() //being printed by A's fun()
B::fun() //being printed by B's fun()
不使用 virtual 关键字。尽管主要代码必须保持不变,但类可以更改。如何做到这一点?
(此外, B
源自 A
)
最佳答案
我希望这是出于教育目的。
如果a
的析构函数不是virtual
,则会导致未定义的行为。因此析构函数必须是虚拟
。
如果析构函数是虚拟
,则可以使用dynamic_cast
。因此,您可以将 A::foo
更改为:
void A::fun()
{
if ( dynamic_cast<B*>(this) )
((B*)this)->fun();
else
std::cout << "A::fun()";
}
非virtual
析构函数的替代方案(如果调用delete
,则行为未定义):
struct A
{
bool isA;
A(bool isA = true) : isA(isA){};
void fun();
};
struct B : A
{
B() : A(false){}
void fun() {cout<<"B::fun()"<<endl;}
};
void A::fun()
{
if (isA)
std::cout << "A::fun()"<<endl;
else
((B*)this)->fun();
}
关于c++ - 我可以从基类指针访问派生类的非虚函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12620299/