父类和子类同名函数以及虚函数多态问题

1、子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。
2、子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
3、子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
4、子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。
实际上这种属于设计错误,不管是父虚子实还是子实父虚。父虚的话,子类即使没有加virtual也会默认加(是否是在编译的时候自动更改?)。而如果子虚父实,则起不到任何多态的作用,所以设计错误,跟不加virtual一样,那为何要加

但是不管是否是需函数,仍然可以通过加 父类::函数名 来调用父类的函数

而如果是有虚函数,那么通过给父类指针赋子类对象地址或通过父类引用
子类对象时,调用虚函数都是子类的虚函数。
但是大小仍然是父类对象的大小,而且仍然可以通过作用域方式调用父类虚函数。而且如果父类有虚函数的话,内存会多4字节。
//从另一方面讲,虚函数有点像static,只被初始化一次。

#include <iostream>
#include <Windows.h>

using namespace std;

class Father
{
    
    
public:
    virtual void Face()
    {
    
    
        cout << "Father's face" << endl;
    }

    void Say()
    {
    
    
        cout << "Father say hello" << endl;
    }

public:
    int m;
};

class Son : public Father
{
    
    
public:
    virtual void Face()
    {
    
    
        cout << "son's face" << endl;
    }
    void Say()
    {
    
    
        cout << "Son say hello" << endl;
    }

public:
    int n;
};
int main()
{
    
    
    Son son1, son2;
    Father f3, f1 = son2;
    f3 = son2;
    Father *f2 = &son1; 
    Father &f4 = son1;
    Son *son3=&son2;
    Father *f5 = (Father *)&son2;


    cout << "FatherSize   " << sizeof(Father) << "Son Size     " << sizeof(Son)<<endl;
    cout << "SonSize   " << sizeof(son1) << "F1     " << sizeof(f1)<<endl;
    cout << "F2   " << sizeof(*f2) << "F3     " << sizeof(f3)<<endl;
    cout << "F4   " << sizeof(f4) << "F3     " << sizeof(*f5)<<endl;
    cout<<"f1.say"<<endl;
    f1.Say();f1.Face();
    cout<<"f2.say"<<endl;
    f2->Say();f2->Face();f2->Father::Face();
    cout<<"f3.say"<<endl;
    f3.Say();f3.Face();
    cout << "f4.say" << endl;
    f4.Say();
    f4.Face();f4.Father::Face();f4.m;
    cout << "f5.say" << endl;
    f5->Say();
    f5->Face();
    f5->Father::Face();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/meixingshi/article/details/114397431