c++ - 如何可靠地调用直接父级的虚函数

标签 c++ polymorphism overriding virtual

考虑这段代码

class Base
{
public:
    virtual void print ()
    {
        std::cout << "Base::print" << std::endl;
    }
};

class BaseA : public Base
{
public:
    virtual void print ()
    {
        std::cout << "BaseA::print" << std::endl;
    }
};

class Derived : public Base
{
public:
    virtual void print ()
    {
        Base::print (); // <= this will always call Base::print even if I derive from BaseA
        std::cout << "Derived::print" << std::endl;
    }

};


int main ()
{
    Base* a = new Derived;
    a->print ();
    delete a;
}

Derived::print 我调用 Base::print 这很好,直到我决定从 BaseA 派生我的 Derived 而不是,因此我当然想调用 BaseA::print。在这个特定示例中将 Base::print 更改为 BaseA::print 不是问题,但是如果我有 20 个这样的虚函数怎么办?

无论那是什么,如何要求编译器调用 print 的直接父版本?

最佳答案

使用类型定义:

class Derived: public BaseA {
    typedef BaseA Base;
    ...

尽管有提议(例如 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3326.pdf),但目前无法对类的直接基类进行编译时自省(introspection)。

关于c++ - 如何可靠地调用直接父级的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622145/

相关文章:

c++ - 在 C++ 中获取类实例的名称?

c++ - 从 C++ 中的矩阵中提取列

c# - 具有泛型的多态性-奇怪的行为

c# - 访问者模式是将域枚举重构为类的最佳方式吗?

c# - C# 中的多态性和静态方法重载。

java - 如何区分子类函数实现、@Override 注解和 "overloading"函数的概念?

c++ - 如何使用 Win32 Hook 模拟 Alt+Tab?

c++ - 如何正确清洁Vulkan对象?

c# - 覆盖属性的 XML 注释

java - 在Java中重写equals和hashCode时应该考虑哪些问题?