【继承与多态】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

继承多态与虚函数及对类的理解

B是A的子类,子类会继承父类的public方法,子类对象可以调用父类的public接口,但是子类和父类函数重名时,父类的方法会被子类覆盖(隐藏),子类调用和父类同名同参函数或者重载父类的函数后不可以直...
  • qq_35956442
  • qq_35956442
  • 2016年11月17日 13:41
  • 377

学习整理——C++ virtual虚函数与多态

多态与动态绑定 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将...
  • Jeffery_Gong
  • Jeffery_Gong
  • 2016年10月07日 17:54
  • 993

【c++知识归纳】继承与多态(一)

c++是基于面向对象的编程语言,面向对象的三大特性为:封装、继承和多态。本文将我对继承与多态的理解进行了总结归纳,这部分内容对于学习c++编程语言是非常重要的,文章加入我的个人理解,希望能给大家带来帮...
  • XHfight
  • XHfight
  • 2016年08月24日 02:45
  • 1396

继承、多态,重载、重写的区别与总…

继承、多态,重载、重写的区别与总结 一道必考的JAVA核心面试题,什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写。 ...
  • li19236
  • li19236
  • 2014年11月25日 18:10
  • 1908

java中的继承和多态以及重载和重写

继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。继承是面向对象的三个基本特征--封...
  • ls5718
  • ls5718
  • 2016年06月02日 10:19
  • 3057

Java之封装、继承、多态(重载、重写)

Java之封装、继承、多态
  • huixion
  • huixion
  • 2016年03月22日 20:37
  • 1311

C++虚函数、多态、继承

虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道...
  • pamchen
  • pamchen
  • 2013年03月05日 19:59
  • 936

C++ 多重继承 虚继承 虚函数表 多态

C++中的多重继承和虚继承是一个非常重要的概念,也是看你是不是懂C++的一个重要的标志之一。这中间包括了运行时多态,虚函数表等等相关概念。 多重继承,顾名思义,是一个类继承了多个父类。例如class...
  • Troy_Wu
  • Troy_Wu
  • 2016年03月25日 15:05
  • 1987

继承中的支配规则和赋值兼容规则

C++的支配规则就是这样: ★在基类和派生类有重名(但可以访问)的成员时,优先派生类的成员 ★如果要访问基类成员,必须加上作用域符:: ★私有(private)成员连派生类也不可以访问,只有本类和友类...
  • HighKit
  • HighKit
  • 2013年04月09日 11:06
  • 775

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,...
  • ljp1919
  • ljp1919
  • 2015年10月03日 15:16
  • 968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
举报原因:
原因补充:

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