gpt4 book ai didi

c++ - Diamond-inheritance 场景在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误

转载 作者:IT老高 更新时间:2023-10-28 22:36:51 24 4
gpt4 key购买 nike

我有一个基类“Base”,它是一个纯虚类:

class Base {

public:
virtual void A() = 0;
virtual void B() = 0;

virtual ~Base() { } // Eclipse complains that a class with virtual members must have virtual destructor
};

我还有 2 个其他类,其中一个实现 A(),另一个实现 B():

class DerivedA : public virtual Base
{
public:
virtual void A() {
printf("Hello from A");
}
};

class DerivedB : public virtual Base
{
public:
virtual void B() {
printf("Hello from B");
}
};

声明中的 virtual 关键字应该可以解决菱形问题。

现在我想把这两个类合并成另一个类,这样 A() 和 B() 都实现了,像这样:

class DerivedC: public DerivedA, public DerivedB {
// Now DerivedA and DerivedB are combined
};

// Somewhere else in the code
DerivedC c;
c.A();
c.B();

问题:即使 G++ 编译代码很好,Eclipse 也会给出错误:类型“DerivedC”必须实现继承的纯虚方法“Base::B”。使用 Visual Studio 编译时,我收到 2 个警告:

warning C4250: 'DerivedC' : inherits 'DerivedB::DerivedB::B' via dominance
warning C4250: 'DerivedC' : inherits 'DerivedA::DerivedA::A' via dominance

所以问题是:这样做的正确方法是什么?上面的代码会产生未定义的行为吗?

注意:标题可能有点误导,我不知道这个问题的标题是什么。

最佳答案

What is the correct way of doing this? Does the code above produce undefined behavior?

代码完全有效。这里没有未定义的行为。
通过 A() 类对象对 DerivedC 的非限定调用将始终调用 DerivedA::A() ,而通过 B() 类对象对 DerivedC 的非限定调用将始终调用 DerivedB::B() 实例。

Visual C++ 给你一个警告,因为你的代码使用了一个不太为人所知的虚拟继承特性,这对大多数普通用户来说可能并不明显,并且可能会让他们感到惊讶。在这种情况下,warning 应该被视为 Informative Nitpick 而不是警告。

请注意,C++ 标准不限制编译器针对完全有效的代码发出信息警告。warning C4250 的文档提供了一个示例,告诉您为什么 Visual C++ 选择发出此警告。

关于c++ - Diamond-inheritance 场景在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965596/

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