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

原创 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.类的一个特征就是封装,public和private作用就是实现这一目的。所以: 用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元...

基类和派生类的转换及动态绑定的条件

友元 友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类,将一个类声明为友元,友元类的所有成员函数可以访问授予友元关系类的所有成员。 2. 必须先定义包含成员函数的类,才能将成员函数设...

关于基类、派生类、对象、指针和虚函数、多态、 静态绑定、 动态绑定 纯虚函数、抽象类

以下观点来源于《深入浅出MFC》到底调用到哪个函数,必须视指针的原始类型而定,于指针实际所指对象无关。1.如果你以一个“基类之指针”指向“派生类”,那么经由该指针你只能够调用基类所定义的函数。2.如果...

派生类的指针绑定到基类的对象(编译通过,但结果不可预知)

多态是面向对象中最重要的特性。在C++中多态的实现是通过带有虚函数的基类的指针或引用绑定到派生类的对象上来体现的。 如果反过来,派生类的指针或引用绑定到积累的对象上有会有什么结果呢?首先这种做法很可...

C++语法基础--动态绑定,派生类,虚函数,覆盖虚函数机制

1.动态绑定:    通过基类的引用(或指针)调用虚函数时,发生动态绑定。    *继承层次的根类一般都要定义虚析构函数    *除构造函数外,任意非static成员函数都可以使虚函数    ...

C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写

为什么要用指针或引用, 为什么要用基类指向派生类, 动态联编的好处。

关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题 http://blog.csdn.net/unituniverse2/article/details/12302139

http://blog.csdn.net/unituniverse2/article/details/12302139 关于通过不含虚析构函数的基类类型的指针删除派生类对...

C++继承中基类和派生类之间指针传递问题

1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B ...

基类与派生类的问题

基类与派生类的问题 ,参考代码,详解: class Base { public: Base(int j): i(j) {} virtual~Base() {} void func1() { ...

虚基类转换为派生类的问题

http://biancheng.dnbcw.info/c/289331.html 看到一个虚函数相关的题目,现在分享下自己的思考。 #include   using...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于基类和派生类的动态绑定问题
举报原因:
原因补充:

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