C++ 为什么在抽象类中使用结构时会出现问题?
我创建了一个简单的示例(因为我的类相当大)。我用以下代码成功地再现了确切的问题: 形状.h 这是抽象类。我故意保持简单 圈.h Circle.cpp 这一切都编在一起。请原谅那些荒谬的价值观/逻辑,它们只是-荒谬的 主要内容如下:C++ 为什么在抽象类中使用结构时会出现问题?,c++,struct,abstract-class,C++,Struct,Abstract Class,我创建了一个简单的示例(因为我的类相当大)。我用以下代码成功地再现了确切的问题: 形状.h 这是抽象类。我故意保持简单 圈.h Circle.cpp 这一切都编在一起。请原谅那些荒谬的价值观/逻辑,它们只是-荒谬的 主要内容如下: #include <iostream> #include "Circle.h" using namespace std; void abstractFuncCheck(Shape& s) { cout << s.aStruct
#include <iostream>
#include "Circle.h"
using namespace std;
void abstractFuncCheck(Shape& s) {
cout << s.aStruct.Ab; //does not work
}
int main() {
Circle c = 140;
//cout << c.aStruct.Ab; //works
abstractFuncCheck(c);
std::cin.get();
}
#包括
#包括“Circle.h”
使用名称空间std;
无效检查(形状和s){
您的Circle
类继承了aStruct
和bStruct
祖先类的Shape
成员,然后声明自己的aStruct
和bStruct
成员。因此Circle
有2个aStruct
成员和2个bStruct
成员>Circle
构造函数仅初始化Circle
成员,而形状
成员是默认初始化的。然后将Circle
实例传递给abstractFuncCheck()时
,它知道如何仅访问形状
成员,这些成员尚未使用圆
值初始化
您需要删除重复的Circle
成员,并在需要时让Circle
方法访问继承的Shape
成员
class Circle : public Shape {
private: //for some reason, names of variables MUST differ from the name of the function
int type1 = 0;
int bonus1 = 1000;
public:
Circle() {}
Circle(int);
int type() { return type1; }
int bonus() { return bonus1; }
//A aStruct; <-- remove this
//B bStruct; <-- remove this
};
类圆:公共形状{
private://由于某些原因,变量名必须与函数名不同
int type1=0;
int-bonus1=1000;
公众:
圆(){}
圆圈(int);
int type(){return type1;}
int bonus(){return bonus1;}
//aStruct;你的编译器应该提醒你注意阴影:每个圆圈
对象都有两个成员aStruct
和两个成员bStruct
。一个是继承的,一个是你在圆圈
类中手动添加的。真不敢相信我错过了。谢谢。编辑:我的编译器根本没有警告我,你sing Visual Studio。我会调查为什么我没有收到警告。哇,哈,谢谢。出于某种原因,我以为我在声明(在抽象类中)任何子类都必须有这些变量,就像纯虚拟函数一样。数据成员不能抽象,它们是具体的,并且属于声明它们的类,如果声明为受保护的或公共的,则派生类可以访问它们。在派生类中只能抽象和重写虚拟方法。Gr请回答,谢谢。我对C++还有些新。我想我可以把结构转换成<代码>保护< /> >,这可能会使我的组织更好一点。@ C++中的JhomasTefferson,抽象类没有明显的概念。任何纯虚拟函数的类都是抽象类。
#include "Circle.h"
Circle::Circle(int s) {
type1 = s;
aStruct.Ab = 666;
aStruct.Ac = 777;
bStruct.Bb = 888;
bStruct.Bc = 999;
}
#include <iostream>
#include "Circle.h"
using namespace std;
void abstractFuncCheck(Shape& s) {
cout << s.aStruct.Ab; //does not work
}
int main() {
Circle c = 140;
//cout << c.aStruct.Ab; //works
abstractFuncCheck(c);
std::cin.get();
}
class Circle : public Shape {
private: //for some reason, names of variables MUST differ from the name of the function
int type1 = 0;
int bonus1 = 1000;
public:
Circle() {}
Circle(int);
int type() { return type1; }
int bonus() { return bonus1; }
//A aStruct; <-- remove this
//B bStruct; <-- remove this
};