Part7 继承与派生 7.3基类与派生类类型转换

公有派生类对象可以被当作基类的对象使用,反之则不可。
  派生类的对象可以隐含转换为基类对象;
  派生类的对象可以初始化基类的引用;
  派生类的指针可以隐含转换为基类的指针。
通过基类对象名、指针只能使用从基类继承的成员。

//7-3类型转换规则举例
#include<iostream>
using namespace std;
class Base1{
public:
    void display() const {
        cout << "Base1::display()" << endl;
    }
};
class Base2: public Base1{
public:
    void display() const {
        cout << "Base2::display()" << endl;
    }
};
class Derived: public Base2{
public:
    void display() const{
        cout << "Derived::dispaly()" << endl;
    }
};

void fun(Base1 *ptr){//参数为指向基类对象的指针,通过基类对象名、指针只能使用从基类继承的成员
    ptr->display();        //对象指针->成员名
}

int main(){
    Base1 base1;
    Base2 base2;
    Derived derived;

    fun(&base1);
    fun(&base2);
    fun(&derived);
    return 0;
}
时间: 2024-08-05 15:53:05

Part7 继承与派生 7.3基类与派生类类型转换的相关文章

从设计基类及其派生类看继承关系

继承能够定义可重用.扩展或修改父类行为的子类.但基类的静态构造函数.实例构造函数和析构函数不能被派生类继承. 在下面实例中,定义一个基类Publication用于表示任何类型的出版物以及派生至Publication的其他类型Book类,由此也可以扩展为定义其他类型如:Magazine.Journal.Newspaper和Article. 在设计基类Publication时我们必须考虑到如下关系: 1.要在基类中添加哪些成员 2.基类是否用作派生类模板的抽象基类 3.类层次结构的扩展空间大小,要开

继承,基类,派生类

在 C++中,继承机制通过类的派生实现,被继承的类称为基类或父类:在继承类的基础上创建的新类称为派生类或子类.派生类的定义格式为:class 派生类名:继承方式基类名 1,继承方式基类名 2,…,继承方式基类名 n{派生类增加的成员声明;};其中,定义中的基类名必须是已有类的名称,派生类名则是新建的类名.一个派生类可以只有一个基类,称为单继承:也可以同时有多个基类,称为多继承.派生类也可作为基类继续派生子类.

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数、派生类到基类的转换 、基类到派生类的转换

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数.派生类到基类的转换 .基类到派生类的转换 一.不能自动继承的成员函数 构造函数 拷贝构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数). 派生类的构造函数需要给基类的构造函数传递参数 #include <iostream

C++:基类与派生类对象之间的赋值兼容关系

4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量.这种不同类型之间的自动转换,称为赋值兼容.在基类和派生类对象之间也存在有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替.因为,通过公有继承,除了构造函数和析构函数外,派生类保留了基类其他的所有的成员.那么,派生类就具有基类的全部功能,凡

基类与派生类的构造函数

一.缺省构造函数的调用关系 通过下面的例子,我们来看一下基类与派生的构造函数的调用顺序.创建时先基类后派生类.销毁时先派生类后基类. #include <iostream> #include <string> using namespace std; class CBase { string name; int age; public: CBase() { cout <<"BASE" << endl; } ~CBase() { cout

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

C++:基类和派生类

4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"sex:"<<sex<<endl; } protected: string name;

c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 public: 6 int x; 7 Parent *p; 8 public: 9 Parent(){} 10 Parent(int x){ 11 this->x=x; 12 p=this; 13 } 14 virtual void f(){ 15 cout<<"Parent::f()&q

从Qt谈到C++(二):继承时的含参基类与初始化列表

提出疑问 当我们新建一个Qt的图形界面的工程时,我们可以看看它自动生成的框架代码,比如我们的主窗口名称为MainWindow,我们来看看mainwindow.cpp文件: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { } 不同于一般的继承,这里的父类的括号里带有参数,我们通常都使用过不带参数,甚至不带括号的基类名称.这里的基类为什么带着参数呢? C++继承与构造函数

基类与派生类的关系

任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的. 基类与派生类之间的关系可以有如下几种描述: 1. 派生类是基类的具体化 类的层次通常反映了客观世界中某种真实的模型.在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化.基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型. 2. 派生类是基类定义的延续 先定义一个抽象基类,该基类中有些操作并未实现.然后定义非抽象的派生类,实现抽象基类中定义的操作.例如,虚