【问题标题】:Calling overridden functions in C++ with multiple inheritance在具有多重继承的 C++ 中调用重写的函数
【发布时间】:2015-12-28 15:56:47
【问题描述】:

我在使用多重继承用例时遇到了问题(这不是我的项目,我没有决定继承方案,抱歉)。无论如何,我似乎无法从覆盖函数调用受保护的virtual 成员函数。这是一个简化的类结构:

class Base {
    protected:
        virtual void foo() { }
};

class A: virtual public Base {
    protected:
        virtual void foo();
};
void A::foo() { printf("Hello A\n"); }

class B: virtual public Base {
    protected:
        virtual void foo();
};
void B::foo() { printf("Hello B\n"); }

class AB: public A, public B {
    protected:
        void foo();
};
void AB::foo()
{
    A::foo();
    B::foo();
}

我希望如果我调用ABfoo(),我会得到类似的输出

Hello A
Hello B

但是,当我编译时,我收到如下错误:

error #308: function "A::foo" is inaccessible
    A::foo();
       ^
error: a nonstatic member reference must be relative to a specific object
    A::foo();
    ^

error #308: function "B::foo" is inaccessible
    B::foo();
       ^
error: a nonstatic member reference must be relative to a specific object
    B::foo();
    ^

即使我将所有foos 公开,我仍然会看到这一点。怎么了?

【问题讨论】:

  • 在 MSVC 中工作。你用的是什么编译器?看起来它认为AB::foo() 不是AB 的成员,请仔细检查您的非简化版本中的签名是否相同..
  • 是的,在 MSVC 中编译得很好!请说明编译器、版本和任何编译器标志(如果您正在使用)。
  • 我意识到我打错了 -- void foo()void AB::foo() 非常不同!

标签: c++ inheritance multiple-inheritance virtual-inheritance


【解决方案1】:

具体的对象可以是*this,所以this->A::foo()this->B::foo()

【讨论】:

    【解决方案2】:

    我没有在正确的命名空间中定义我的函数。 void foo()void AB::foo() 很不一样!

    【讨论】:

      猜你喜欢
      • 2016-06-30
      • 2011-07-18
      • 1970-01-01
      • 2011-06-24
      • 2015-05-24
      • 2015-03-24
      • 2017-12-30
      • 2016-06-13
      • 2020-07-24
      相关资源
      最近更新 更多