我遇到某个任务的问题,这是一个练习,而不是一个真正的程序.任务是定义结构D的复制构造函数,其行为方式与compliler生成的复制构造函数完全相同.
class Ob{
};
struct A {
Ob a;
};
struct B : A {
Ob b;
};
struct C : A, B {
Ob c;
};
struct D : C, A {
Ob d;
};
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,结构A在D结构中间接导出几次导致复制构造函数定义模糊不清的原因如下:
D(const D& _d) : C(_d), A(_d), d(_d.d) {}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何正确定义该复制构造函数?没有上面提到的定义的代码编译,所以它似乎应该是可能的.
MinGW 4.8.1错误消息:
zad3.cpp:12:8: warning: direct base 'A' inaccessible in 'C' due to ambiguity [enabled by default]
struct C : A, B {
^
zad3.cpp:16:8: warning: direct base 'A' inaccessible in 'D' due to ambiguity …Run Code Online (Sandbox Code Playgroud) c++ multiple-inheritance ambiguity copy-constructor ambiguous
假设我们有一个具有虚方法的基类:
class BaseClass
{
virtual void MethodToOverride() const
{
DoSomething();
}
};
Run Code Online (Sandbox Code Playgroud)
一个派生类覆盖了该方法(取决于我们可以再次虚拟或不再虚拟的情况):
class DerivedClass : public BaseClass
{
void MethodToOverride() const
{
DoSomethingElse();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们犯了一个错误,例如定义MethodToOverride非const或错误的字符,我们只需定义一个新方法,例如:
void MethodToOverride() {} // I forgot the const
void MthodToOverride() const {} // I made a typo
Run Code Online (Sandbox Code Playgroud)
因此编译很好,但在运行时会导致不必要的行为.
有没有办法将函数定义为现有函数的显式覆盖,所以如果我错误地定义它,编译器会发出警告?像(我知道它不存在)的东西:
void MethodToOverride() const overrides BaseClass::MethodToOverride() const {}
Run Code Online (Sandbox Code Playgroud) 假设,我想创建一个类如下,不使用虚拟继承.从"lower"实例访问"upper"类的成员的语法是什么?已经有一些左,右的方法,但不确定哪个是"规范"正确的.如何访问成员更低---上方?
/* upper
/ | \
left | right
\ | /
lower
*/
class upper {
public:
int base;};
class left : public upper {};
class right : public upper {};
class lower : public right, public left, public upper {};
int main(){
lower a;
// a.base=1; // error: request for member 'base' is ambiguous
// a.upper::left::lower::base=1; // error: 'upper::left' has not been declared
// a.lower::left::upper::base=2; // error: 'upper' is an ambiguous base of 'lower'
// a.left::upper::base=1; // error: …Run Code Online (Sandbox Code Playgroud)