关于基类和派生类的动态绑定问题

原创 2016年06月01日 22:49:24

关于基类和派生类的动态绑定问题

Example 1

Quote是基类

class Quote
{
public:
    //constructor and other member function
    virtual std::ostream& debug (std::ostream& os)
     {
         os << bookNo << " " << price << " ";
         return os;
     }
//member data
private: 
}

Bulk_quote是派生类

class Bulk_quote : public Quote
{
public:
    // constructor
    std::ostream& debug(std::ostream& os) override
    {
        Quote::debug(os) << quantity << " " << discount;
        return os;
    }
};
int main()
{
    Quote a("12232", 12.3);
    Bulk_quote b("3344", 22.2, 8, 0.13);
//    Disc_quote c;
    Quote *p1 = &a;
    Quote *p2 = &b;
    Quote &pt1 = a;
    Quote &pt2 = b;
    ///////////////////////
    a.debug(std::cout)<< endl;
    b.debug(std::cout)<< endl;
    p1->debug(std::cout)<< endl;
    p2->debug(std::cout)<< endl;
    pt1.debug(std::cout)<< endl;
    pt2.debug(std::cout)<< endl;
}

运行结果

  • p2和pt2的静态类型是基类的指针或者引用,但是被指向或者绑定在了派生类上,而debug()成员函数是virtual function, 所以在用指针和引用的时候编译器就要判断选择基类还是派生类

Example 2

class Base
{
public:
    virtual void fn1 () {std::cout << "Base::fn1() operated" << std::endl;}
    void fn2() {std::cout << "Base::fn2() operated" << std::endl;}
};

class Derived: public Base
{
public:
    void fn1() override {std::cout << "Derived::fn1() operated" << std::endl;}
    void fn2() {std::cout << "Derived::fn2() operated" << std::endl;}
};
int main()
{
    Derived der;
    Derived *der_ptr;
    Base *base_ptr;
    der_ptr = &der;
    base_ptr = &der;
    der_ptr->fn1();
    der_ptr->fn2();
    base_ptr->fn1();
    base_ptr->fn2();
}

运行结果

这里写图片描述

  • 动态绑定只对virtual function 有用,由于fn2 是基类中的普通成员函数, 则 base_ptr 虽然指向一个派生类,其调用的函数还是派生类对象中的基类部分中的成员函数
版权声明:本文为博主原创文章,未经博主允许不得转载。

派生类和基类的关系

派生类和基类的关系C++一个主要目标是提供代码重用,类继承是实现该目标的重要途径之一。从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。 派生类和基类的关系: 1. 派生类对象存储了基类...
  • white__bear
  • white__bear
  • 2015年12月03日 22:30
  • 3403

C++-继承:基类与派生类的关系

成员函数的重定义和名字隐藏基类的数据成员和成员函数在派生类中都有一份拷贝,派生类能够直接访问从基类继承而来的public和protected成员,且只能够通过这两类成员访问从基类继承而来的privat...
  • ko_tin
  • ko_tin
  • 2017年02月23日 18:29
  • 331

C++(29)基类和派生类

面向对象编程 --概述、定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象、继承和动态绑定。 在C++中,用类进行数据抽象,用类派生从一个类继承...
  • u011225629
  • u011225629
  • 2015年08月08日 19:57
  • 1204

基类和派生类的赋值规则

在公有继承方式下: 派生类的对象/对象指针/对象引用可以赋值给基类的对象/对象指针/对象引用,基类的对象/对象指针/对象引用不能赋值给派生类的对象/对象指针/对象引用。因为派生类包含了基类的所有...
  • u011403897
  • u011403897
  • 2013年08月19日 17:22
  • 1298

基类和派生类之间的同名函数,存在重载吗?

  • nanyu
  • nanyu
  • 2009年07月19日 10:07
  • 6877

派生类和基类的函数调用

这篇文章举了一个简单的例子说明派生类和基类在虚函数和普通函数的问题; 首先声明派生类和基类,并进行定义,如下所示: 声明部分(Header.h): class FATHER { public: vo...
  • GK_2014
  • GK_2014
  • 2015年05月13日 22:57
  • 1452

Java基类和派生类

Java基类和派生类
  • KingOfOnePiece
  • KingOfOnePiece
  • 2016年01月12日 16:17
  • 3111

C++中派生类和基类的转换和访问控制

区分“派生类对象”和“派生类”对基类成员的访问权限。 l “派生类对象”对基类成员的访问权限:    (1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。...
  • KingCat666
  • KingCat666
  • 2015年04月06日 21:58
  • 1163

虚函数调用时一点注意,调用基类函数时调用派生类函数

一般的认为,虚机制发生在对象调用 时,其实不然,只要能用到之时,他便会出现!在调用基类函数的时候,如果基类调用了一个虚函数,同样虚机制也会产生效果!看一个程序,没有virtual的情况: #inclu...
  • ztz0223
  • ztz0223
  • 2007年12月20日 09:47
  • 2732

C# 基类 派生类 方法隐藏 方法重写

最近重新学习C#中基础,找到了隐藏基类方法和重写基类方法的一点区别,二者都是在派生类中定义了与基类中相同的方法,相同点派生类对象将执行各自的派生类中的方法,不同点,在向上转型后,重写基类方法的调用的是...
  • lycommand
  • lycommand
  • 2014年08月30日 23:03
  • 1285
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于基类和派生类的动态绑定问题
举报原因:
原因补充:

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