美文网首页
c++温故知新1(基类与派生类)

c++温故知新1(基类与派生类)

作者: 李相赫的乐芙兰 | 来源:发表于2018-07-13 15:52 被阅读3次

基类

class A{

public:

void printA(){cout<<"Class A";}

};

子类

class B{

public:

void printA(){cout<<"Class AB";}

void printB(){cout<<"Class B";}

};

A* p_a = new A;

((B*)p_a)->printA(); ///输出"Class AB",调用的是子类的函数,但是危险

A* p_ab = new B;

p_ab->printA(); ///输出“Class A", 调用的是基类的函数

///p_ab->printB(); error,printB不是A的成员

///(B*)p_ab->printB(); error,printB不是A的成员

((B*)p_ab)->printA(); ///输出"Class AB",调用的是子类的函数

///(B*)p_ab->printA(); error, 无法由void*转换为B*,运算符优先级问题,这里会被解释为试图将printA的返回值转换为(B*)

///B* p_b = new A; error,无法从A*转换为B*

B* p_b = new B;

p_b->printA(); ///输出“Class AB",若B没有实现printA,将会调用A的printA输出”Class A"

p_b->printB();

///B* p_ba = p_a; error,无法从A*转换为B*

B* p_ba = (B*)p_a; ///可以通过强转将子类指针指向父类

p_ba->printA(); ///输出"Class AB",调用子类的函数

p_ba->printB(); ///可以调用,但是危险

总结:

1.基类的指针指可以向派生类的对象,但指向的是派生类中基类的部分。所以只能操作派生类中从基类中继承过来的数据和基类自身的数据

2.基类指针经过强转后可以调用派生类的成员函数

3.派生类的指针,因为内存空间比基类长,所以原则上不允许派生类的指针指向基类,直接赋值会编译出错,但是可以强转,不过这样的操作很危险

4.无论父类里面有没有虚函数,都可以定义指向子类实例的父类指针.

5.如果父类里没有虚函数,则使用父类指针,只能访问父类的成员,而不能访问子类里的成员.

6.如果父类里的虚函数不是纯虚函数,且子类里没有重写该虚函数,则用父类指针访问该虚函数的时候,跟访问父类里的普通函数一样.

7.如果父类里的虚函数不是纯虚函数,且子类里重写了该虚函数,则用父类指针访问该虚函数的时候访问的是子类里重写后的函数.

8.如果父类里的虚函数是纯虚函数,则父类是个抽象类,子类要想能够被实例化,则必须重写该纯虚函数.用父类指针访问该纯虚函数的时候,访问到的是子类里重写了的函数.

9.再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏.

相关文章

  • c++温故知新1(基类与派生类)

    基类 class A{ public: void printA(){cout<<"Class A";} }; 子类...

  • 10 多态 抽象

    /*多态本质:c++ 允许将派生类对象的地址赋予基类的指针所有派生类的本质都是is a 的基类基类的指针调用任何方...

  • C#——访问基类的成员

    1.基类与派生类之间的转换C#允许派生类转换为基类,但不允许把基类转换为派生类。这样,一个基类的对象即可以指向基类...

  • 2019-12-20C++中派生类对基类成员的访问形式及规则

    C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2...

  • C++primer面向OOP程序设计(3)

    1.继承: 在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于 某此函数,基类希望它...

  • C++ 类继承

    C++类的继承要点: 派生类不能直接访问基类的私有成员变量,只能通过基类的公有或保护方法进行访问。 创建派生类对象...

  • 15/9/10

    rtti:运行阶段识别异常 grand(基类) superb(派生类1) Magnificent(派生类2) 基类...

  • OC.派生、重写、多态

    1.派生类是在基类的基础之上设计出来的, 其目的是扩展基类的功能或修改基类功能. 派生类包含了基类的所有特征与功能...

  • 芦继超9.19总结

    派生类成员的标识与访问 1.当派生类与基类中有相同成员时: 若未强行指名,则通过派生类对象使用的是派生类中的同名成...

  • C++派生类中调用基类成员函数和构造函数

    C++的派生类中,可以使用基类命名空间,调用基类的成员函数和成员变量,如下所示。 假设这样一个情况,我们在派生类的...

网友评论

      本文标题:c++温故知新1(基类与派生类)

      本文链接:https://www.haomeiwen.com/subject/ucfspftx.html