C++ 虚拟继承问题-警告:';沙发';没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出
我对虚拟继承有一个问题,这是虚拟继承的示例代码 我得到的问题如下 警告:“Sofabed”没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出 床和沙发也受到了同样的警告 我如何解决这个问题 在上运行此示例代码C++ 虚拟继承问题-警告:';沙发';没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出,c++,c++11,C++,C++11,我对虚拟继承有一个问题,这是虚拟继承的示例代码 我得到的问题如下 警告:“Sofabed”没有越界的虚拟方法定义;它的vtable将在每个翻译单元中发出 床和沙发也受到了同样的警告 我如何解决这个问题 在上运行此示例代码 Mac OS 10.14.6 Qt Creator 4.11.1 基于Qt5.14.1(Clang10.0(Apple),64位) #包括 #包括 #包括 使用名称空间std; 类家具{//公共基类 保护:整数重量; 公众: void SetWeight(inta=0){wei
#包括
#包括
#包括
使用名称空间std;
类家具{//公共基类
保护:整数重量;
公众:
void SetWeight(inta=0){weight=a;}
int GetWeight(){返回权重;}
void ShowWeight(){
cout正如警告所说,您应该在实现文件(.cpp)中至少定义一个虚拟函数。由于基类中无论如何都应该有一个虚拟析构函数,因此它是修复此警告的一个很好的候选者:
标题:
class Furniture { //common base class
protected: int weight;
public:
virtual ~Furniture();
void SetWeight(int a=0) { weight=a; }
int GetWeight() { return weight; }
void ShowWeight() {
cout << "weight=" << weight << endl;
}
};
我将所有代码都放在main.cpp中。
我尝试了阿兰的解决方案,但仍然存在同样的问题
所以,我需要使用您的解决方案,在头文件中声明
但我修改了它如下,然后它的工作
class Furniture { //common base class
protected: int weight;
public:
void SetWeight(int a=0) { weight=a; }
int GetWeight() { return weight; }
void ShowWeight() {
cout << "weight=" << weight << endl;
}
};
class Sofa : virtual public Furniture {
public:
virtual ~Sofa();
void sit() { cout << "sit!" << endl; }
//void ShowWeight() {
// cout << “Sofa weight=” << weight; }
};
class Bed : virtual public Furniture {
public:
virtual ~Bed();
void lie() { cout << "lie!" << endl; }
//void ShowWeight() {
// cout << “Bed weight=” << weight; }
};
class Sofabed : public Sofa, public Bed {
public:
virtual ~Sofabed();
void fold() { cout << "fold!" << endl; }
};
class家具{//公共基类
保护:整数重量;
公众:
void SetWeight(inta=0){weight=a;}
int GetWeight(){返回权重;}
void ShowWeight(){
cout在#include
块之后,添加命名空间{
,在main
之前添加结束}
。永远不要使用命名空间std;
…使用,如果基类家具
不应该是可实例化的,可以通过使析构函数纯虚拟虚拟~Furniture()=0;
(但将默认实现保留在.cpp
文件中)使其抽象化。
...
Furniture::~Furniture()
{}
...
class Furniture { //common base class
protected: int weight;
public:
void SetWeight(int a=0) { weight=a; }
int GetWeight() { return weight; }
void ShowWeight() {
cout << "weight=" << weight << endl;
}
};
class Sofa : virtual public Furniture {
public:
virtual ~Sofa();
void sit() { cout << "sit!" << endl; }
//void ShowWeight() {
// cout << “Sofa weight=” << weight; }
};
class Bed : virtual public Furniture {
public:
virtual ~Bed();
void lie() { cout << "lie!" << endl; }
//void ShowWeight() {
// cout << “Bed weight=” << weight; }
};
class Sofabed : public Sofa, public Bed {
public:
virtual ~Sofabed();
void fold() { cout << "fold!" << endl; }
};