20150310的一些总结

1.今天被朋友问了一个问题:

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

using namespace std;

class father{
    public:
        void run()
        {
            start();
        }
    protected:
        virtual void start(){

            cout << "father start" << endl;
        }
    private:
        int a;
        int dd;
        double fd;
};

class child : public father
{
    public:
        virtual void start(){
            cout << "child start" << endl;
        }
        void getfather(){
            father* ff = this;
            father fd = *ff;
            fd.run();
        }
    private:
        int b;
        double d;
};

int main(int argc, const char *argv[])
{
    child chi;
    chi.run();
    return 0;
}
这个示例的输出结果:实际是:child start

此时run中调用的start()方法是派生类的start而不是基类中的start!问题是此时的访问start的方法是静态联编还是动态绑定?

先看一个示例:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class D
{
    public:
        void printA(){
            cout << "A" << endl;
            printB();
        }
        virtual void printB(){
            cout << "B" << endl;
        }

};

int main(int argc, const char *argv[])
{
    D *d = NULL;
    d->printA();//错误,输出:A segmentfault 11
    D d2;
    d2.printA();//正常输出
    return 0;
}
分析:printA()是非虚成员函数,d-> 和d2. 都可以实现对它的访问,但是当访问虚函数时(多态性)d->实际指向的对象是空的,所以肯定会出错!

总结:虚函数的多态性表现不是基类指针指向派生类,实际上可以让一个派生类指针指向另一个派生类(同一个基类),实现多态!


#include <iostream>
#include <string>
#include <vector>
using namespace std;

class A{
    public:
        void run(){
            cout << " type:" << typeid(*this).name() << endl;
            print();
        }
    virtual void print(){
           cout << " type:" << typeid(*this).name() << endl;
           cout << "A" << endl;
        }
};

class B : public A{
    public:
        void print(){//隐藏了父类的print函数
            cout << "B" << endl;
        }
};

class C : public A{
    public:
        virtual void print(){
            cout << "C" << endl;
        }
};

int main(int argc, const char *argv[])
{
//    C *c = (C*)(A*)new B();
//    c->print();
    B *b = new B();
    b->run();
    cout << "----" << endl;
    B b2 ;
    b2.run();
    //    B *b2 = NULL;
//    b2->run();
    return 0;
}

当print是虚函数时输出:

 type:1B
B
----
 type:1B
B

当print是非虚函数时的输出:

 type:1A
 type:1A
A
----
 type:1A
 type:1A
A
分析:

发布了73 篇原创文章 · 获赞 18 · 访问量 11万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览