尝试使用虚拟继承解决它时的钻石问题
Diamond issue when trying to resolve it using virtual inheritance
我是 C++ 的新手,在解决菱形问题时我很烂:
这里的代码:
#include <iostream>
using namespace std;
// Base class
class Base
{
public:
virtual void getArea()
{
cout << "Called by Base\n";
}
};
// Derived class
class Rectangle: public virtual Base
{
public:
void getArea()
{
cout << "Called by Rectangle\n";
}
};
// Derived class
class Square: public virtual Base
{
public:
void getArea()
{
cout << "Called by Square\n";
}
};
// Derived class
class Triangle: public Rectangle, Square
{
public:
void blabla(){}
};
int main(void)
{
Triangle Tri;
Tri.getArea();
return 0;
}
我遇到了 g++ 错误:
main.cpp:36:7: error: no unique final overrider for ‘virtual void Base::getArea()’ in ‘Triangle’
class Triangle: public Rectangle, Square
^
main.cpp: In function ‘int main()’:
main.cpp:45:6: error: request for member ‘getArea’ is ambiguous
Tri.getArea();
^
main.cpp:29:12: note: candidates are: virtual void Square::getArea()
void getArea()
^
main.cpp:19:12: note: virtual void Rectangle::getArea()
void getArea()
我在互联网上发现虚拟继承解决了问题所以我的错误是什么。
提前致谢
作为编译器思考:应该调用什么方法?
你有一个既是正方形又是长方形的三角形,你问的是面积。您的三角形应该选择使用 Rectangle.getArea()
还是 Square.getArea()
?
编译器无法知道。这里的解决方案是覆盖 getArea() 方法,例如:
class Triangle: public Rectangle, Square
{
public:
void blabla(){}
void getArea()
{
Square::getArea; //I'm a square
Rectange::getArea; //I'm a rectangle
}
};
即使没有class基地也会触发这个问题。使用钻石继承的示例如下所示:
class Base
{
protected:
int x;
};
class Derived1: virtual public Base
{
//some stuff
};
class Derived2: virtual public Base
{
//some stuff
};
class Join: public Derived1, public Derived2
{
int getX(){
return x;
}
};
在这里,使用虚拟继承允许我们在 Join 实例中只有一个 Base class 实例,而不是 2 个没有和应该选择 x 的错误。
您的问题是您有两个不同的 类 在同一继承级别,提供不同的虚方法覆盖。编译器不知道哪个应该优先,所以你需要提供自己的覆盖并做任何你想做的事情(调用其中一个函数,两个函数,或者滚动你自己的实现)。
我是 C++ 的新手,在解决菱形问题时我很烂: 这里的代码:
#include <iostream>
using namespace std;
// Base class
class Base
{
public:
virtual void getArea()
{
cout << "Called by Base\n";
}
};
// Derived class
class Rectangle: public virtual Base
{
public:
void getArea()
{
cout << "Called by Rectangle\n";
}
};
// Derived class
class Square: public virtual Base
{
public:
void getArea()
{
cout << "Called by Square\n";
}
};
// Derived class
class Triangle: public Rectangle, Square
{
public:
void blabla(){}
};
int main(void)
{
Triangle Tri;
Tri.getArea();
return 0;
}
我遇到了 g++ 错误:
main.cpp:36:7: error: no unique final overrider for ‘virtual void Base::getArea()’ in ‘Triangle’
class Triangle: public Rectangle, Square
^
main.cpp: In function ‘int main()’:
main.cpp:45:6: error: request for member ‘getArea’ is ambiguous
Tri.getArea();
^
main.cpp:29:12: note: candidates are: virtual void Square::getArea()
void getArea()
^
main.cpp:19:12: note: virtual void Rectangle::getArea()
void getArea()
我在互联网上发现虚拟继承解决了问题所以我的错误是什么。
提前致谢
作为编译器思考:应该调用什么方法?
你有一个既是正方形又是长方形的三角形,你问的是面积。您的三角形应该选择使用 Rectangle.getArea()
还是 Square.getArea()
?
编译器无法知道。这里的解决方案是覆盖 getArea() 方法,例如:
class Triangle: public Rectangle, Square
{
public:
void blabla(){}
void getArea()
{
Square::getArea; //I'm a square
Rectange::getArea; //I'm a rectangle
}
};
即使没有class基地也会触发这个问题。使用钻石继承的示例如下所示:
class Base
{
protected:
int x;
};
class Derived1: virtual public Base
{
//some stuff
};
class Derived2: virtual public Base
{
//some stuff
};
class Join: public Derived1, public Derived2
{
int getX(){
return x;
}
};
在这里,使用虚拟继承允许我们在 Join 实例中只有一个 Base class 实例,而不是 2 个没有和应该选择 x 的错误。
您的问题是您有两个不同的 类 在同一继承级别,提供不同的虚方法覆盖。编译器不知道哪个应该优先,所以你需要提供自己的覆盖并做任何你想做的事情(调用其中一个函数,两个函数,或者滚动你自己的实现)。