关于c++多态

来源:互联网 发布:android网络编程 编辑:程序博客网 时间:2024/06/07 02:38

下面这段代码:

#include <iostream>  #include <string.h>  class parent{public:    virtual void who()    {        std::cout << "I am class Parent" << std::endl;    }};class son : public parent{public:    virtual void who() override /*final*/    {        std::cout << "I am class Son" << std::endl;    }};class daughter : public parent{public:    virtual void who() override /*final*/    {        std::cout << "I am class Daughter" << std::endl;    }};int main(){    son *pmyson = new son;    daughter *pmydaughter = new daughter;    memcpy(pmydaughter, pmyson, sizeof(*pmyson));    std::cout << "---1----------" << std::endl;    pmyson->who();    pmydaughter->who();    std::cout << "---2----------" << std::endl;    (*pmyson).who();    (*pmydaughter).who();    //      parent *pmyson1 = new son;    parent *pmydaughter1 = new daughter;    memcpy(pmydaughter1, pmyson1, sizeof(*pmyson1));    std::cout << "---3----------" << std::endl;    pmyson1->who();    pmydaughter1->who();    std::cout << "---4----------" << std::endl;    (*pmyson1).who();    (*pmydaughter1).who();    //      son myson;    daughter mydaughter;    memcpy(&mydaughter, &myson, sizeof(myson));    std::cout << "---5----------" << std::endl;    myson.who();    mydaughter.who();    std::cout << "---6----------" << std::endl;    ((parent*)(&myson))->who();    ((parent*)(&mydaughter))->who();    return 0;}

输出应该是什么呢?

学过C++,应该你会有自己的答案,但是vs运行一下,可能结果并不是你所想象的。

//输出:---1----------I am class SonI am class Son---2----------I am class SonI am class Son---3----------I am class SonI am class Son---4----------I am class SonI am class Son---5----------I am class SonI am class Daughter---6----------I am class SonI am class Son
那如果把注释掉的“final”重新加上呢?
//输出:---1----------I am class SonI am class Daughter---2----------I am class SonI am class Daughter---3----------I am class SonI am class Son---4----------I am class SonI am class Son---5----------I am class SonI am class Daughter---6----------I am class SonI am class Son

作为一个需要不断学习温故的好学之士,我也搞不懂了。

另外,vs编译不过可以使用http://cpp.sh/试试哦。

0 0