C++如何从main调用派生基类函数

标签 c++ inheritance polymorphism

我有三个类,每个类都继承自另一个:A 由 B 继承,B 由 C 继承。我在这些类中的每一个中都有一个虚函数。我想创建一个包含 C 类对象的 A 类指针,并像这样调用 B 类函数:

class A
{
public:
    virtual void doStuff() = 0;
};

class B : public A
{
public:
    virtual void doStuff() override;
};

class C : public B
{
public:
    void doStuff() override;
};

void B::doStuff()
{
    std::cout << "Starting doStuff in B\n";
    doStuff();
    std::cout << "Ending doStuff in B\n";
}

void C::doStuff()
{
    std::cout << "doStuff in C\n";
}

int main()
{
    A *pointer = new C();
    pointer->B::doStuff(); // This doesn't work
}

如果我稍微改变我的 main,我会得到正确的输出:

int main()
{
    B *pointer = new C(); // Changed A to B
    pointer->B::doStuff();
}

输出

Starting doStuff in B
doStuff in C
Ending doStuff in B

如何更改我的原始代码以使用 A 类指针并且最好只使用一个函数名称?

最佳答案

问题是 B::doStuff 不是 B 类中 doStuff 的实现,它不是 A。如果您确定指针实际上指向 B 的实例或从 B 派生的对象,那么您可以编写以下内容:

int main()
{
    A *pointer = new C();
    reinterpret_cast<B*>(pointer)->B::doStuff(); // This should work
}

如果您不能确定实例类型,请使用 dynamic_cast

关于C++如何从main调用派生基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435247/

相关文章:

c++ - 在使用矩阵进行计算时删除 C++ 二维 vector 行

c++内存管理局部变量的内存分配

c++ - 如何在派生类中访问聚合

.net - EF4 无法将具体类型转换为接口(interface)

c++ - eclipse CDT : How to use GCC C++ compiler on C sources?

c++ - dynamic_cast "this"到派生类型 : when is it legal?

c++ 只继承公共(public)构造函数

c++ - typeinfo 和dynamic_cast 外部未解析

php - PHP 类中的 "Transient"属性?

java - 列表多态性