相关疑难解决方法(0)

由多重继承引起的C++中复制构造函数的模糊调用

我遇到某个任务的问题,这是一个练习,而不是一个真正的程序.任务是定义结构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

6
推荐指数
2
解决办法
2046
查看次数

如何确保方法在C++中覆盖现有的虚拟方法?

假设我们有一个具有虚方法的基类:

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)

c++ oop virtual overriding

2
推荐指数
2
解决办法
420
查看次数

c ++使用"菱形"继承语法访问基类成员

假设,我想创建一个类如下,不使用虚拟继承.从"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)

c++

2
推荐指数
1
解决办法
112
查看次数