首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教派生类继承基类的赋值函数吗

2012-03-26 
请问派生类继承基类的赋值函数吗?在Ivor Horton的“Visual C++ 2005入门经典”书中写到派生类是不继承基类重

请问派生类继承基类的赋值函数吗?
在Ivor Horton的“Visual C++ 2005入门经典”书中写到派生类是不继承基类重载的赋值运算符的成员函数的。但是请看下面这两个类:

class A
{
public:
A& operator= (const A& a)
{
cout<<"Hello"<<endl;

return *this;
}
};

class B : public A
{
};

如果在main中这样写:
B a, b;
b = a;

我们会发现Hello有输出,似乎继承了赋值运算符。但是如果在
B a, b;处设置断点,而且用单步调试时我们会看到程序不会进入函数
A& operator= (const A& a)
{
cout<<"Hello"<<endl;

return *this;
}

可如果在main中这样写:
A a, b;
b = a;

还是在A a, b;处设置断点,用单步调试,程序是会进入赋值函数内的。因此我相信书中说的是对的,派生类没有继承基类的赋值函数,但是到底是什么原因使得用派生类对象赋值时会调用基类的赋值函数呢?

[解决办法]
B a, b;
b = a; 因为a是B类型,所以不会调用 A& operator= (const A& a)
如果你不提供operator=那么编译器会自动生成一个.
[解决办法]
B a,b 是两个同类型的对象,相互之间的赋值不会调用父类的赋值函数

而在类中,如果你自己不写一个显示的赋值函数,那么编译器会自动产生一个默认的赋值函数,a=b的时候调用这个B类的赋值函数,所以你在调试的时候不可能看到程序进入A类的赋值函数
[解决办法]
我们会发现Hello有输出,似乎继承了赋值运算符。但是如果在 
B a, b;处设置断点,而且用单步调试时我们会看到程序不会进入函数 
--------------
你再试看看,会不会进进入


派生类是不继承基类重载的赋值运算符的成员函数
--------------
B类没有定义赋值运算函数,所以编译器会自动生成,
B的默认赋值运算函数会调用(而不是继承)A类的赋值运算函数


热点排行