#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();
}
输入&amp;输出: 基类: 输入a,b和c的值:1 2 3
a,b和c的值:1 2 3
派生类: A的值:1342 1342 B的值:-14 -14 C值:11330 11330
我想使用此代码,以便我可以轻松了解私有,公共和受保护数据的继承...
请更正此代码,以便我真正了解c ++继承 或者请回复解释c ++继承的代码..
答案 0 :(得分:4)
实例化d
时,不会初始化基类的数据成员。它们的值未确定(未对默认初始化内置类型或POD执行初始化),并且从它们读取实际上是未定义的行为。
在读取基类数据成员之前,必须确保初始化它们。根据您的需要,有很多方法可以做到这一点。至少,您可以确保它们通过在构造函数中初始化它们的值进行零初始化:
class base
{
public:
base() : a(), b(), c() {} // default constructor
...
这将导致您致电d.read()
设置d.x
,d.y
,d.z
至0
,因为它所做的一切都是从{{1分别是{},a
和b
。
答案 1 :(得分:2)
派生类的方法不会自动调用基类的相同方法 - 它替换基本实现,它不会添加到它。如果你想使用基类实现,你必须自己这样做。
void derived :: read()
{
base::read();
x=a;
y=b;
z=c;
}
答案 2 :(得分:2)
当您创建Derived
的实例时,它不会获得您从控制台分配给a
实例的b
c
和Base
的值:这是另一个独立的对象!
void derived :: read() {
x=a;
y=b;
z=c;
}
这实际上会将垃圾放入x
y
和z
。
您可以在base::read()
内拨打derived::read()
来初始化a
b
和c
答案 3 :(得分:2)
我猜你试图做类似以下的事情:
#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();
}
请注意,要使用多态,您应该使用virtual关键字,以便不完全屏蔽函数,但是,这在指针的情况下是相关的,并且将某个基指针分配给派生类型的对象。
另请注意,实现读取的方式实际上会将垃圾放到xyz中,因为abc不会通过基础对象的读取功能读取,因为没有人调用它。这就是为什么你在那里得到随机值,而不是在控制台中输入的值。
我建议阅读一些关于c ++多态性的内容。 我在下面找到了一个很好的教程资源:http://www.cplusplus.com/doc/tutorial/polymorphism/
我希望这会有所帮助。