【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

原创 2016年05月30日 17:17:54

    实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则:


  1. 子类对象可以赋值给父类对象(切割/切片)

  2. 父类对象不能赋值给子类对象

  3. 父类的指针/引用可以指向子类对象

  4. 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)


#include<iostream>
using namespace std;

class People    //父类或者基类
{
public:
    void Display()
    {
        cout << "_name" << endl;
    }
protected:
    string _name;
};


class Student:public People        //子类或者派生类
{
protected:
    int _num;
};


void Test()
{
    People p;
    Student s;
    p = s;    //切片
    //s = p;    //无法通过,说明父类对象不可以赋值给子类对象
    People* p1 = &s;    //父类的指针和引用可以指向子类
    People& p2 = s;

    //Student* s1 = &p;    //子类的指针和引用不可以指向父类
    //Student& s2 = p;
    Student* s1 = (Student*)&p;    //可以通过强转实现
    Student& s2 = (Student&)p;

    //p2->_num = 10;    //_num是子类对象,要越界父类对象才能访问到子类对象
    //s2._num = 20;
}


int main()
{
    Test();
    system("pause");
    return 0;
}


    如何书写基类与派生类的默认成员函数呢?如:构造函数、拷贝构造函数、赋值运算符重载、析构函数。

#include<iostream>
using namespace std;

class People
{
public:
    People(const char* name)
        :_name(name)
    {
        cout << "People()" << endl;
    }

    People(const People& p)
        :_name(p._name)
    {
        cout << "People(const People& p)" << endl;
    }

    People& operator=(const People& s)
    {
        if (&s != this)
        {
            cout << "People& operator= (const People& s)"<<endl;
            _name = s._name;
        }
        return *this;
    }

    ~People()
    {
        cout << "~People()" << endl;
    }

protected:
    string _name;
};

class Student:public People
{
public:
    Student(const char* name, int num)
        :People(name)
        , _num(num)
    {
        cout << "Student()" << endl;
    }

    Student(const Student& s)
        :People(s)
        , _num(s._num)
    {
        cout << "Student(const Student& s)" << endl;
    }
    
    Student& operator= (const Student& s)
    {
        if (this != &s)
        {
            cout << "Student& opeartor= (const Student& s)" << endl;
            People::operator=(s);
            _num = s._num;
        }
        return *this;
    }

    ~Student()
    {
        cout << "~Student()" << endl;
    }
protected:
    int _num;
};

void Test()
{
    Student s1("张三",15);
    Student s2(s1);
    Student s3("李四",12);
    s3 = s1;
}


int main()
{
    Test();
    system("pause");
    return 0;
}


虚函数&多态

虚函数:

在类的成员函数前面加上virtual,成为虚函数。

虚函数的重写:

当在子类中定义了一个与父类相同的虚函数时,就称为子类的函数重写了父类的虚函数。

多态:

使用父类的函数或者指针调用函数时,若指向父类的虚函数就调用父类的虚函数,若调用子类的虚函数就调用子类的虚函数。

    如:

#include<iostream>
using namespace std;

class People
{
public:
    virtual void BuyTickets()
    {
        cout << "买票" << endl;
    }
};

class Student :public People
{
public:
    virtual void BuyTickets()
    {
        cout << "买票-半价" << endl;
    }
};

void Fun(People& p)
{
    p.BuyTickets();
}

void Test()
{
    People p;
    Student s;
    Fun(p);//People为父类,则调用父类的虚函数。
    Fun(s);//调用子类的虚函数。
}

int main()
{
    Test();
    system("pause");
    return 0;
}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1749895

【C++】模版类实现普通类静态顺序表

在C或C++里,我们已经学会了如何实现一个静态顺序表了,那为何还要引入模版类来实现静态顺序表呢?首先,我们看,在未引入模版前,我们在C++里是这样定义一个静态顺序表的:typedef int Data...

【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)

在cplusplus.com里,我们可以搜索list来查看库是如何实现双向链表的。当然,我们也可以在平时使用时包上头文件list来调用C++里的list库。在这里,我今天就不再赘述用C语言或者C++未...

详解C++中的多态、虚函数、父类子类

 这一篇主要是想讲解一下C++中的多态性,这也是我在学习Win32和MFC编程中碰到的,算是总结一下吧。 首先来看一段程序: #include using namespace std; cl...

多态:如何判断一个成员函数是否为虚函数(即函数的重写或覆盖)

判断一个成员函数是不是虚函数(重写),有两个三个条件: 两个成员函数各自在基类和派生类中定义; 基类中定义的成员函数必须带有关键字virtual,派生类的成员函数可带可不带。 这两个成员函数原型(函数...

javascript:类,成员变量,成员函数,类变量,类方法,继承,多态

javascript:类,成员变量,成员函数,类变量,类方法,继承,多态 1) 类 类的定义:function Circle(r) { this.r = r; } 类的实例化: ...
  • xlx9984
  • xlx9984
  • 2014年03月10日 21:10
  • 654

C++ — 继承和多态的基础虚函数类

这里的虚函数在继承和多态里有举足轻重的位置,它解决了不少继承和多态里面的问题,所以一定要深刻理解,活学活用。...
  • Dawn_sf
  • Dawn_sf
  • 2017年04月01日 11:28
  • 1221

C++ 类继承(廿一)--基类、派生类、多态继承、公有继承、私有继承、虚函数、保护继承、多重继承

概念:创建派生类对象时,程序首先调用基类的构造函数,然后再调用派生类的构造函数。基类构造函数负责初始化继承的数据成员,派生类构造函数主要用于初始化新增的数据成员。派生类构造函数总是调用一个基类构造函数...

C++对象布局及多态之虚成员函数调用

在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。   struct C180 ...

Day49、子类模板访问基类模板、模板型模板参数、嵌套模板的外部定义、“零”初始化、虚函数和多态、编译模型

5、子类模板访问基类模板 在子类模板中访问那些在基类模板中声明依赖于模板参数的符号,应该在它前面加上作用域限定符“::”或者显式使用this指针,否则编译器将试图在全局域中寻找该符号,引发错误。 ...

C++ 虚函数与多态 教学PPT

  • 2010年10月25日 20:06
  • 687KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
举报原因:
原因补充:

(最多只允许输入30个字)