c++ - 我可以从基类指针访问派生类的非虚函数吗?

标签 c++ inheritance polymorphism virtual

我有这个代码:

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/

相关文章:

c++ - 如何从 2 个子类修改基类变量

c++ - 对虚拟表、构造函数和析构函数的 undefined reference

c++ - 在 C++17 中跟踪相对内存使用情况

c++ - 使 std::cout 在同一行中一个接一个地输出多个字符串

C++ 同步和备份框架

c++ - 继承默认构造函数在 gcc 中失败,但在 clang 中有效,哪个有 bug?

java - 可变类作为不可变类的子类

c++ - Qt 应用程序不在 Qt Creator 中执行

vb.net - 如何使派生类可克隆?

php - Laravel Eloquent 与扩展模型的关系