继承同一基类的两个类能否相互使用';s函数? 我一直在C++中基于继承来解决这个问题,我不确定我的方法是否正确。 class A { private: string s; public: A(string s); virtual ~A; virtual void set(string s); virtual string get(); }; class B : public virtual A { public: void set(string s); string get(); } class C : public virtual A { public: void set(string s); } class D : public B, public C { public: void set(string s); }

继承同一基类的两个类能否相互使用';s函数? 我一直在C++中基于继承来解决这个问题,我不确定我的方法是否正确。 class A { private: string s; public: A(string s); virtual ~A; virtual void set(string s); virtual string get(); }; class B : public virtual A { public: void set(string s); string get(); } class C : public virtual A { public: void set(string s); } class D : public B, public C { public: void set(string s); },c++,inheritance,C++,Inheritance,当从D调用set方法时,我的代码应该调用C的set方法,但在C的set方法内部调用B的get方法。我不明白这是怎么可能的,因为B和C是完全不相关的,它们都继承相同的基类。我确信这是我如何处理这些头文件的问题,但我尝试的每个解决方案都只会导致编译错误 D的集合方法很简单 D::set(string s){ C::set(s); D::set(s); } 首先,正如在一篇评论中指出的,所有这些成员函数都是私有的,因此它们都不能调用任何其他函数。假设这是一个拼写错误,并且它们实际上都被标

当从D调用set方法时,我的代码应该调用C的set方法,但在C的set方法内部调用B的get方法。我不明白这是怎么可能的,因为B和C是完全不相关的,它们都继承相同的基类。我确信这是我如何处理这些头文件的问题,但我尝试的每个解决方案都只会导致编译错误

D的集合方法很简单

D::set(string s){
   C::set(s);
   D::set(s);
}

首先,正如在一篇评论中指出的,所有这些成员函数都是私有的,因此它们都不能调用任何其他函数。假设这是一个拼写错误,并且它们实际上都被标记为public(或者每个类都是其他所有类的朋友,这绝对不是一个好主意),这可以用一种相当简单的方式来完成

D::set()
中,要调用
C::set()
。那很容易。就这么做吧:

void D::set(string s) {
    C::set(s);
}
现在您希望
C::set()
调用
B::get()
。您不能直接这样做,因为
C
不知道
B
。但是,由于
get()
是一个虚拟函数,您可以调用它并依靠虚拟分派来获取唯一的重写器,即
B::get()
。即:

void C::set(string s) {
    std::string res = get();
}
这是因为这个特殊的
C
对象实际上是
D
对象的一部分,每个
D
对象都有一个子对象覆盖
a::get()
。在普通的
C
对象中,对
get()
的调用将调用
a::get()


需要明确的是:这是一个非常混乱的类层次结构,所以不要为丢失而感到尴尬。另一方面,可能丢失意味着它太复杂了,并且这里存在设计问题。

请提供一个解决方案。您没有调用任何方法,实际上您没有在显示的代码中定义任何类型安全的方法。可能有B类型的对象不是C类型的,那么您不能调用C::set。进行不安全的强制转换是可以做到的,但正如前面所说,这并不总是有效的。这里的意图真的是每个成员函数都是私有的吗?如果是这样的话,这里就没有什么可以做的了。这不是死亡之钻吗?@noobius是的,这是一个作业,老师故意在以后的论文问题中使设计有缺陷。
C::set
是私有的,但不能从
D
@eerorika调用它——一切都是私有的,所以什么都称不上。正如我所说,这是一个非常混乱的类层次结构。毫无疑问,这是一个打字错误。这是一个错误,我本想把它们公之于众,但我只是纠正了这个错误。这是一个分配,它是明确规定的层次结构设置如下。我不知道在这种情况下,在C中调用get会调用B的get,谢谢!