gpt4 book ai didi

c++ - 为什么 C++ 不让基类实现派生类的继承接口(interface)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:34 25 4
gpt4 key购买 nike

这就是我要说的

// some guy wrote this, used as a Policy with templates
struct MyWriter {
void write(std::vector<char> const& data) {
// ...
}
};

在一些现有的代码中,人们没有使用模板,而是接口(interface)+类型删除

class IWriter {
public:
virtual ~IWriter() {}

public:
virtual void write(std::vector<char> const& data) = 0;
};

其他人想要同时使用这两种方法和写作

class MyOwnClass: private MyWriter, public IWriter {
// other stuff
};

MyOwnClass 是根据 MyWriter 实现的。为什么MyOwnClass继承的成员函数不自动实现IWriter的接口(interface)?相反,用户必须编写除了调用基类版本之外什么都不做的转发函数,如

class MyOwnClass: private MyWriter, public IWriter {
public:
void write(std::vector<char> const& data) {
MyWriter::write(data);
}
};

我知道在 Java 中,当您有一个实现接口(interface)的类并派生自恰好具有合适方法的类时,该基类会自动为派生类实现接口(interface)。

为什么 C++ 不这样做?这似乎是很自然的事情。

最佳答案

这是多重继承,有两个具有相同签名的继承函数,都有实现。这就是 C++ 与 Java 的不同之处。

因此,在静态类型为 MyBigClass 的表达式上调用 write 会导致无法确定需要哪个继承函数。

如果 write 仅通过基类指针调用,则无需在派生类中定义 write,这与问题中的声明相反。 既然问题已更改为包含纯说明符,则必须在派生类中实现该函数才能使类具体且可实例化。

MyWriter::write不能用于MyBigClass的虚调用机制,因为虚调用机制需要一个接受隐式IWriter* const的函数thisMyWriter::write 接受一个隐式的 MyWriter* const this。需要一个新函数,它必须考虑到 IWriter 子对象和 MyWriter 子对象之间的地址差异。

编译器理论上可以自动创建这个新函数,但它很脆弱,因为基类的更改可能会突然导致选择一个新函数进行转发。它在 Java 中不那么脆弱,只有单继承是可能的(转发到什么函数只有一个选择),但在支持完全多重继承的 C++ 中,选择是模棱两可的,我们甚至还没有开始菱形继承(钻石问题)或虚拟继承。

其实这个问题(子对象地址的差异)是为虚继承解决的。但它需要额外的开销,而这在大多数情况下是不必要的,并且 C++ 的指导原则是“您不必为不使用的东西付费”。

关于c++ - 为什么 C++ 不让基类实现派生类的继承接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906579/

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