C++ C++;继承未返回正确的值 #包括 #包括 阶级基础 { 公众: INTA; int b; 无效读取(); void display(); 受保护的: INTC; }; void base::read() { couta>>b>>c; } void base::display() { cout
当您实例化C++ C++;继承未返回正确的值 #包括 #包括 阶级基础 { 公众: INTA; int b; 无效读取(); void display(); 受保护的: INTC; }; void base::read() { couta>>b>>c; } void base::display() { cout,c++,C++,当您实例化d时,您不会初始化基类的数据成员。它们的值是不确定的(不会对默认初始化的内置类型或POD执行初始化),从它们读取实际上是未定义的行为 您必须确保在读取基类数据成员之前对其进行初始化。根据您的需要,可以通过多种方式进行初始化。至少,您可以通过在构造函数中对其进行值初始化来确保其初始化为零: #include<iostream.h> #include<conio.h> class base { public: int a; int b; void re
d
时,您不会初始化基类的数据成员。它们的值是不确定的(不会对默认初始化的内置类型或POD执行初始化),从它们读取实际上是未定义的行为
您必须确保在读取基类数据成员之前对其进行初始化。根据您的需要,可以通过多种方式进行初始化。至少,您可以通过在构造函数中对其进行值初始化来确保其初始化为零:
#include<iostream.h>
#include<conio.h>
class base
{
public:
int a;
int b;
void read();
void display();
protected:
int c;
};
void base :: read()
{
cout<<"\nEnter values of a , b and c :";
cin>>a>>b>>c;
}
void base :: display()
{
cout<<"\nValues of a,b and c :"<<a<<" "<<b<<" "<<c;
}
class derived : public base
{
int x;
public:
int y;
void read();
void display();
protected:
int z;
};
void derived :: read()
{
x=a;
y=b;
z=c;
}
void derived :: display()
{
cout<<"\nValue of A :"<<a<<" "<<x;
cout<<"\nValue of B :"<<b<<" "<<y;
cout<<"\nValue of C :"<<c<<" "<<z;
}
void main()
{
clrscr();
base b;
cout<<"\nBase Class :";
b.read();
b.display();
derived d;
cout<<"\nDerived Class :";
d.read();
d.display();
getch();
}
这将导致您调用
d.read()
设置d.x
,d.y
,d.z
到0
,因为它所做的一切都是分别从a
,b
和c
赋值。派生类的方法不会自动调用基类的相同方法-它会替换基本实现,不会添加到基类中。如果如果你也想使用基类实现,你必须自己去做
class base
{
public:
base() : a(), b(), c() {} // default constructor
...
创建
Derived
的实例时,它不会获取从控制台分配给Base
实例的a
b
和c
的值:它是另一个独立的对象
void derived :: read()
{
base::read();
x=a;
y=b;
z=c;
}
这实际上将垃圾放入x
y
和z
中。
您可以在
derived::read()
内部调用base::read()
来初始化a
b
和c
我猜您尝试了以下操作:
void derived :: read() {
x=a;
y=b;
z=c;
}
#包括
#包括
阶级基础
{
公众:
INTA;
int b;
虚拟空读();
虚拟虚空显示();
受保护的:
INTC;
};
void base::read()
{
couta>>b>>c;
}
void base::display()
{
请正确地缩进代码,而不是给每个行自己随机的缩进。在代码示例中,您不做任何多态性,所以我不明白为什么您会期望继承影响任何东西。无论您使用什么资源来学习C++,现在是时候找到更好的。您应该声明哪些值是您期望看到的。不可以不删除。我们的评论。一旦你问了一个问题,它不仅是你的,而且是公开的。我正在恢复最初问的问题,以便评论和回答继续有意义。
#include<iostream.h>
#include<conio.h>
class base
{
public:
int a;
int b;
virtual void read();
virtual void display();
protected:
int c;
};
void base :: read()
{
cout<<"\nEnter values of a , b and c :";
cin>>a>>b>>c;
}
void base :: display()
{
cout<<"\nValues of a,b and c :"<<a<<" "<<b<<" "<<c;
}
class derived : public base
{
int x;
public:
int y;
virtual void read();
virtual void display();
protected:
int z;
};
void derived :: read()
{
base::read()
x=a;
y=b;
z=c;
}
void derived :: display()
{
base::display()
cout<<"\nValue of A :"<<a<<" "<<x;
cout<<"\nValue of B :"<<b<<" "<<y;
cout<<"\nValue of C :"<<c<<" "<<z;
}
void main()
{
clrscr();
base b;
cout<<"\nBase Class :";
b.read();
b.display();
derived d;
cout<<"\nDerived Class :";
d.read();
d.display();
getch();
}