gpt4 book ai didi

c++ - 适当的继承设计

转载 作者:行者123 更新时间:2023-11-30 02:53:27 24 4
gpt4 key购买 nike

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

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

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

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


#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();
}

最佳答案

IBinary::readb 定义中的virtual 使一切变得不同。

当您从 IBinary 继承时,层次结构中覆盖 IBinary 的所有 readb 也是隐式虚拟的。所以虚拟调度开始了,就像它应该的那样。

如果您不这样做,则调用将静态解析。因为调用在 B 内部,所以调用的是 B::readb

关于c++ - 适当的继承设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com