1

我有三个名为 A、B 和 C 的类。B 继承自 A,C 继承自 B。(A -> B -> C)。

我还有一个名为 IBinary 的抽象基类。我想让所有的类都实现 IBinary 接口。当我让 A 类继承自 IBinary 时,我的代码输出为C::readb. 当 A 类不继承自 IBinary 时,输出为B:readb.

让我的三个类订阅相同接口的正确方法是什么?如果我只有从接口类继承的顶级类(A),我需要重构我的代码,这样我就不会像上面那样遇到解析问题。

如果我明确地让所有类都从接口类继承,那么我将拥有一个更复杂的类层次结构,并且更接近于拥有一颗死亡钻石。


#include <iostream>

class IBinary {
public:
    virtual void readb( std::istream& in ) = 0;
};

// Basic A -- change whether this inherits from IBinary
class A : public IBinary {
public:
    A() {};

    void readb( std::istream& in ) {}
};

// Specialized A
class B : public A {
public:
    B() {};

    void load() {
        this->readb(std::cin);        // <-- which readb is called?
    }
    void readb( std::istream& in ) {
        std::cout << "B::readb" << std::endl;
    }
};

// Specialized B
class C : public B {
public:
    C() {};

    void readb( std::istream& in ) {
        std::cout << "C::readb" << std::endl;
    }
    void foo() {
        B::load();
    }
};

int main() {
    C c;
    c.foo();
}
4

3 回答 3

1

只需A继承IBinary其将使所有子级都可用作抽象接口IBinary

于 2013-08-01T19:15:03.360 回答
1

简而言之,您看到这种行为的原因是因为A::readb未声明virtual

因为IBinary::readbis virtual,当A从它继承时,默认A::readb变为virtual

如果您添加virtual到 的每个声明readb,而不仅仅是第一个声明,您的代码会表现得更加一致。出于这个原因,许多 C++ 代码风格指南都要求在所有派生类virtual中声明所有方法virtual,即使它们不是祖先基类。

于 2013-08-01T19:16:21.727 回答
1

virtual定义中的IBinary::readb一切都不同。

当您继承 from 时,层次结构中覆盖fromIBinary的所有s也是隐式虚拟的。因此,正如它应该的那样,虚拟调度开始了。readbIBinary

如果您不这样做,则呼叫将静态解决。因为调用在 inside B,所以B::readb被调用。

于 2013-08-01T19:17:23.950 回答