C++ 为什么在抽象类中使用结构时会出现问题?

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

我创建了一个简单的示例(因为我的类相当大)。我用以下代码成功地再现了确切的问题:

形状.h

这是抽象类。我故意保持简单

圈.h

Circle.cpp

这一切都编在一起。请原谅那些荒谬的价值观/逻辑,它们只是-荒谬的

主要内容如下:

#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
};