c++中子类不能继承父类的一些函数这个不能继承修饰的到底是什么

c++中子类不能继承父类的一些函数(构造函数,析构函数,赋值运算符重载函数)这个“不能继承”修饰的到底是什么,子类到底不能对这三类函数作什么呢??尤其是赋值运算符重载函数??不能继承的原因,求知道的大牛指教,因为网上根本就没有解释,或者都对这些问题避而不谈 为什么呀???

不能说是不能继承。通常情况下,子类的构造函数和析构函数一般会包含父类的流程。
默认情况下,构造对象时,先调用父类的构造函数,然后调用子类的构造函数。
销毁时是相反的,先调用子类的析构函数,再调用父类的析构函数。
赋值运算符在程序员不重写的情况下,编译器会默认生成一个,但是它做的事情是位拷贝,和隐式拷贝构造函数一样,就是说,当A = B时,它是把B的整个这块内存中的内容直接按位拷贝给A的内存,这样的后果就是当该类的成员有指针时,就很容易发生野指针造成程序崩溃。所以,当成员存在指针时,程序员应当重写赋值运算符。
书上不能继承的含义可能就是它是一种集合包含的关系而不是父子继承的关系,而赋值运算符,上述两种关系都不算。
希望对撸主有帮助。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-21
类似的解释应该是有的,不过可能比较零散。
不能继承构造函数:意味着子类不能覆盖这类函数,(就是说构造函数不能为虚)。另,不能把父类的构造函数当子类的成员函数来调用(这一点很关键,因为继承本质上意味着父类的成员就是子类的成员)。
子类的构造函数执行其他任何操作前,必须先调用父类的构造函数(除非父类没有构造函数),初始化父类地址空间成员。子类的构造函数可以指定由调用父类哪个构造函数(如果父类有重载多个构造函数),如果不指定,默认调用无参构造函数。
不能继承析构函数:子类可以覆盖父类的析构函数,不能把父类的析构函数当子类的成员函数来调用。
不能继承赋值运算符重载函数:
http://www.pconline.com.cn/pcedu/empolder/gj/c/0504/588320.html
这个网址解释了赋值运算符重载函数。不能继承,意味着当子类对象的赋值过程(当作左值对象已存在时)是通过直接按位拷贝(浅拷贝),而非调用父类的赋值运算符重载函数。

上面几个“不能继承”虽然其限制条件不太一样,但是都有一个共同点:父类的成员不是子类的成员。
什么是“成员”?
对于非静态成员,
可以这样访问的:

对象名.成员名

或:

指针名->成员名

在子类内部可以这么访问:

this->成员名。

至于静态成员则是:

类名::成员名

请问能通过此方法访问父类的那三种函数吗?显然不行。
第2个回答  推荐于2016-01-16
class Base
{
Base( int ) { ... }
Base( const Base& rhs ) { ... } // 复制构造函数, 可以继承
Base& operator=( const Base& rhs ) { return *this ; } // 复制赋值操作符, 可以继承
Base& operator=( int x ) { ... return *this ; } // 赋值运算符重载函数, 不能继承
} ;

class Derived : public Base
{ } ;

int main()
{
Base b( 10 ) // okay, general construction
Derived d( 10 ) ; // error, 你不能继承父类的构造函数

Base b2( b ) ; // okay, copy construction
Derived d2( d ) ; // okay, 调用Base::Base(const Base& ), 结果是部分复制.

Base b3 ; b3 = b ;// okay, copy assignment
Derived d3 ; d3 = d ; .// okay, 调用Base::operator=( const Base& ), 结果是不完全赋值
b = 4 // okay , call Base::operator=( int ) ;
d = 4 // error
}

作者的意思是,你得自己定义这些函数
不能继续原因很简单. 这些复制控制函数会初始化,或销毁自己的成员, 在基类中, 根本就不可能
知道远程子类的成员, 更不用谈初始化或者销毁它们.
所以大部分情况都是子类在自己的构造函数中调用父类构造函数,初始化父类成员, 然后再初始化自己的成员

网上没有多谈这些的原因是.
熟悉C++面向对象的人自然而然理解为什么不能继承.
不熟悉C++面向对象的人, 根本就想不到这类问题.
所以你应该是少部分懂?不懂?的人.本回答被提问者采纳
第3个回答  推荐于2016-01-25
class Base
{
Base( int ) { ... }
Base( const Base& rhs ) { ... } // 复制构造函数, 可以继承
Base& operator=( const Base& rhs ) { return *this ; } // 复制赋值操作符, 可以继承
Base& operator=( int x ) { ... return *this ; } // 赋值运算符重载函数, 不能继承
} ;

class Derived : public Base
{ } ;

int main()
{
Base b( 10 ) // okay, general construction
Derived d( 10 ) ; // error, 你不能继承父类的构造函数

Base b2( b ) ; // okay, copy construction
Derived d2( d ) ; // okay, 调用Base::Base(const Base& ), 结果是部分复制.

Base b3 ; b3 = b ;// okay, copy assignment
Derived d3 ; d3 = d ; .// okay, 调用Base::operator=( const Base& ), 结果是不完全赋值
b = 4 // okay , call Base::operator=( int ) ;
d = 4 // error
}
不能继承构造函数:意味着子类不能覆盖这类函数,(就是说构造函数不能为虚)。另,不能把父类的构造函数当子类的成员函数来调用(这一点很关键,因为继承本质上意味着父类的成员就是子类的成员)。
子类的构造函数执行其他任何操作前,必须先调用父类的构造函数(除非父类没有构造函数),初始化父类地址空间成员。子类的构造函数可以指定由调用父类哪个构造函数(如果父类有重载多个构造函数),如果不指定,默认调用无参构造函数。
不能继承析构函数:子类可以覆盖父类的析构函数,不能把父类的析构函数当子类的成员函数来调用。
第4个回答  2021-01-23
final
加在成员函数声明后面。

c++中子类不能继承父类的一些函数这个不能继承修饰的到底是什么
不能说是不能继承。通常情况下,子类的构造函数和析构函数一般会包含父类的流程。默认情况下,构造对象时,先调用父类的构造函数,然后调用子类的构造函数。销毁时是相反的,先调用子类的析构函数,再调用父类的析构函数。赋值运算符在程序员不重写的情况下,编译器会默认生成一个,但是它做的事情是位...

子类可以继承父类的什么
子类不能继承父类的所有方法和属性,只能继承父类所有的非private(私有)的属性和方法,而private成员是不能被继承的。打个比方:你能继承你爸的财产,但不能继承你爸的所有财产。因为你爸要养老,这是会把财产的一部分作为私有,不让你继承。 JAVA的继承也就这样。父类中public,protected修饰的属性...

C++中子类可以直接调用父类实现的函数吗
子类能不能调用父类的函数与继承方式有关,C++有三种继承方式:1.公用继承(public):对于基类成员在派生类中保持自己原来的的访问级别,原来是public(private\/ protected),在派生类中也还是public(private\/protected)。2.受保护继承(protected):基类中的public成员和protected成员在派生类中为protected,priv...

c++继承的规则是什么
(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public\/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。(2)private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。

C++子类会无条件继承父类的构造函数么
在C++中,构造函数不会自动继承,只是如果子类没有写构造函数,那么系统会这个类自动添加一个默认构造函数,是一个空函数体,所以什么也没有做,接着就会调用父类的构造函数,所以你觉得是继承了父类的构造函数。子类和父类的构造函数的调用顺序:class B:public A B b1;那么构造函数的调用顺序是:A(...

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数...
当然可以重写,函数名和参数保持一致就会重写;如果函数名一样,参数不一样则是隐藏;总之,非虚函数,只要子类定义了相同名称的,父类函数都不能直接访问。这样的问题,自己写个Test自然明了,印象也会更深刻。

C++基类的静态成员能被派生类继承吗
当然能被继承派生。

C++中,为什么子类对象可以赋值给父类对象而反过来却不行?
子类从父类继承了所有的方法和属性,那么父类有的子类都有,所以子类可以给父类的赋值;反过来,如果子类不但继承了父类的方法和属性,它还增加了新的属于自己的方法和属性,此时你用父类的对象去赋值给子类的对象,这些新的方法和属性要怎么操作呢,C++为了避免这样的现象出现,当你用父类对象给子类...

...继承时候子类中若有与父类里函数同名的函数,不是会覆盖父类中的...
覆盖的条件是:基类必须是虚函数(virtual声明的),发生覆盖的两个函数9要在派生类和基类中,函数名称和参数列表完全相同。你上面的这种情况没有用virtual,基类的函数被隐藏,不是覆盖。你回去可以看看多态那一张,好好复习下

在C++中如何区分类的继承和包含这两种关系
继承是从父类继承公有的属性和方法, 这些公有的属性和方法可以供多个子类使用, 写在父类里边就不用维护多份代码.包含就是定义另一个类的对象, 从这个类继承也可以得到这个类的想要的属性和方法, 与继承不同的是, 包含不是父子关系, 比如你写一个男人类, 他有一个女朋友对象, 那你只能使用包含,...

相似回答