一个关于派生类继承父类私有属性的有关问题 请问
一个关于派生类继承父类私有属性的问题 请教
父类
class People {
public:
People(char *str); //构造函数
~People(); //析构函数
protected:
char *name;
};
#endif
父类实现:
{
People::People(char *str) {
name = new char[strlen(str)+1];
strcpy(name, str);
cout < < "People construct: " < <name < <endl;
}
//析构函数的实现
People::~People() {
cout < < "People destroy: " < <name < <endl;
delete []name;
}People::People(char *str) {
name = new char[strlen(str)+1];
strcpy(name, str);
cout < < "People construct: " < <name < <endl;
}
//析构函数的实现
People::~People() {
cout < < "People destroy: " < <name < <endl;
delete []name;
}
派生类:
class Teacher : public People {
public:
Teacher(char *str, char *sch); //构造函数
~Teacher(); //析构函数
protected:
char *school;
};
派生实现
Teacher::Teacher(char *str, char *sch)
:People(str) //调用基类的构造函数
{ school = new char[strlen(sch)+1];
strcpy(school,sch);
cout < < "Teacher construct: " < <name < < " in "------1
< <school < <endl;
}
Teacher::~Teacher() {
cout < < "Teacher destroy: " < <name < < " in "-----------2
< <school < <endl;
delete []school; }
父类成员name必须为保护类型,才能在派生类的构造,析构函数中 1,2处 用到name。改为私有类型,子类中就无法访问。 但是子类继承时也有自己的name属性 继承过来,为什么不能调用, 1,2处调用的name是父类的还是子类的?
------解决方案--------------------
首先子类会继承父类的所有数据成员。公有继承以为着B是一个A,即teacher是一个people,所以name属性是teacher和people都拥有的属性,不能说是谁就是谁的了。
但是父类的private成员子类无权过问,“私有”的意义就在于独自占有。既然如此为什么还要继承private成员呢? C++的语义支持把一个子类转换成一个父类,如果子类丢失了父类的某个数据成员,怎么能成功转换呢?
------解决方案--------------------
//假设有类Base和Drived如下:
class Base
{
private:
char name[10];
};
class Drived:public Base
{
//不论是public继承还是private继承,Drived对象的内存布局
//都与下面的Drived_likeness一样,所不同的是可访问性和对name的操作.
//因为这里的name来自Base,如果name在Base中被声明为private的,
//那么,虽然Drived对象中有name的位置,但不能直接访问.所有对name的
//操作都要依靠基类的非私有函数.
//如果name在Base中被声明为protected的或public的,本类的函数就可以
//访问了. 如果是private继承,name的可访问性就变为private的,public继承则
//name可访问性不变(但若name在基类中就是private的,则不可访问).
//错误观点1:如果是私有的父类成员,那么子类是不可能继承的吧。
//这个话好象是在说Drived中就没有name的位置,所以错.
//错误观点2:子类继承后相当于一个引用一样,调用的时候还是用到父类的定义
//怎么扯到引用上去了呢
//再强调一启遍:子类对象也是一个整体,包括从父类继承部分(如本例中的name)
//和自己新增部分(如本例中的age)
private:
int age;
};
class Drived_likeness
父类
class People {
public:
People(char *str); //构造函数
~People(); //析构函数
protected:
char *name;
};
#endif
父类实现:
{
People::People(char *str) {
name = new char[strlen(str)+1];
strcpy(name, str);
cout < < "People construct: " < <name < <endl;
}
//析构函数的实现
People::~People() {
cout < < "People destroy: " < <name < <endl;
delete []name;
}People::People(char *str) {
name = new char[strlen(str)+1];
strcpy(name, str);
cout < < "People construct: " < <name < <endl;
}
//析构函数的实现
People::~People() {
cout < < "People destroy: " < <name < <endl;
delete []name;
}
派生类:
class Teacher : public People {
public:
Teacher(char *str, char *sch); //构造函数
~Teacher(); //析构函数
protected:
char *school;
};
派生实现
Teacher::Teacher(char *str, char *sch)
:People(str) //调用基类的构造函数
{ school = new char[strlen(sch)+1];
strcpy(school,sch);
cout < < "Teacher construct: " < <name < < " in "------1
< <school < <endl;
}
Teacher::~Teacher() {
cout < < "Teacher destroy: " < <name < < " in "-----------2
< <school < <endl;
delete []school; }
父类成员name必须为保护类型,才能在派生类的构造,析构函数中 1,2处 用到name。改为私有类型,子类中就无法访问。 但是子类继承时也有自己的name属性 继承过来,为什么不能调用, 1,2处调用的name是父类的还是子类的?
------解决方案--------------------
首先子类会继承父类的所有数据成员。公有继承以为着B是一个A,即teacher是一个people,所以name属性是teacher和people都拥有的属性,不能说是谁就是谁的了。
但是父类的private成员子类无权过问,“私有”的意义就在于独自占有。既然如此为什么还要继承private成员呢? C++的语义支持把一个子类转换成一个父类,如果子类丢失了父类的某个数据成员,怎么能成功转换呢?
------解决方案--------------------
//假设有类Base和Drived如下:
class Base
{
private:
char name[10];
};
class Drived:public Base
{
//不论是public继承还是private继承,Drived对象的内存布局
//都与下面的Drived_likeness一样,所不同的是可访问性和对name的操作.
//因为这里的name来自Base,如果name在Base中被声明为private的,
//那么,虽然Drived对象中有name的位置,但不能直接访问.所有对name的
//操作都要依靠基类的非私有函数.
//如果name在Base中被声明为protected的或public的,本类的函数就可以
//访问了. 如果是private继承,name的可访问性就变为private的,public继承则
//name可访问性不变(但若name在基类中就是private的,则不可访问).
//错误观点1:如果是私有的父类成员,那么子类是不可能继承的吧。
//这个话好象是在说Drived中就没有name的位置,所以错.
//错误观点2:子类继承后相当于一个引用一样,调用的时候还是用到父类的定义
//怎么扯到引用上去了呢
//再强调一启遍:子类对象也是一个整体,包括从父类继承部分(如本例中的name)
//和自己新增部分(如本例中的age)
private:
int age;
};
class Drived_likeness