虚函数不进入基数class
virtual function doesn't enter to the base class
我想知道为什么这个函数打印 "aba h()" 而不是 "son h()",因为它是虚拟的。我想也许这个函数隐藏了另一个函数,但它有相同的签名。
class Aba: public Saba {
public:
Aba(){cout << "Aba Ctor" << endl;}
Aba(const Aba& a){cout << "Aba Copy Ctor" << endl;}
~Aba(){cout << "Aba Dtor" << endl;}
virtual void g(){cout << "Aba g()" << endl;}
virtual void f(int){cout << "Aba f(int)" << endl;}
virtual void h(){cout << "Aba h()" << endl;}
};
class Son: public Aba {
public:
Son(){cout << "Son Ctor" << endl;}
Son(const Son& a){cout << "Son Copy Ctor" << endl;}
~Son(){cout << "Son Dtor" << endl;}
void f(){cout << "Son f()" << endl;}
void h(){cout << "Son h()" << endl;}
};
主要内容:
int main()
{
Aba aba = Aba();
aba.h();
return 0;
}
virtual
方法根据所引用的对象类型进行解析。在你的例子中,对象类型是 always Aba
因为即使你分配 Son()
,对象也会被分割成 Aba
。因此它打印 Aba::h()
方法。
可以使用引用和指针进行运行时动态绑定。在以下情况下,它将打印 Son::h()
.
Son s;
Aba& r = s;
r.h(); // r referres to Son
Aba* p = &r; // or &s
p->h(); // p points/referred to Son
虚函数解析为对象的动态类型的相应函数,而不是非虚函数那样的静态类型:
Aba && one = Aba();
// static type: reference to Aba
// dynamic type of referenced object: Aba
因此,虚函数解析为定义为 Aba
成员的函数。
Aba && two = Son();
// static type: reference to Aba
// dynamic type of referenced object: Son
假设存在这样的定义,现在虚函数将解析为 Son
中的定义。
这里是用静态对象调用函数h
,因此这个函数的调用只在编译时解析,与它无关功能是虚拟的。此调用已绑定。
仅在动态对象的情况下,绑定在运行时完成,查看指针指向哪个对象。
Aba *ptr = new Son;
ptr->h(); //Ptr is pointing to Son, hence Son::h() will get called.
我想知道为什么这个函数打印 "aba h()" 而不是 "son h()",因为它是虚拟的。我想也许这个函数隐藏了另一个函数,但它有相同的签名。
class Aba: public Saba {
public:
Aba(){cout << "Aba Ctor" << endl;}
Aba(const Aba& a){cout << "Aba Copy Ctor" << endl;}
~Aba(){cout << "Aba Dtor" << endl;}
virtual void g(){cout << "Aba g()" << endl;}
virtual void f(int){cout << "Aba f(int)" << endl;}
virtual void h(){cout << "Aba h()" << endl;}
};
class Son: public Aba {
public:
Son(){cout << "Son Ctor" << endl;}
Son(const Son& a){cout << "Son Copy Ctor" << endl;}
~Son(){cout << "Son Dtor" << endl;}
void f(){cout << "Son f()" << endl;}
void h(){cout << "Son h()" << endl;}
};
主要内容:
int main()
{
Aba aba = Aba();
aba.h();
return 0;
}
virtual
方法根据所引用的对象类型进行解析。在你的例子中,对象类型是 always Aba
因为即使你分配 Son()
,对象也会被分割成 Aba
。因此它打印 Aba::h()
方法。
可以使用引用和指针进行运行时动态绑定。在以下情况下,它将打印 Son::h()
.
Son s;
Aba& r = s;
r.h(); // r referres to Son
Aba* p = &r; // or &s
p->h(); // p points/referred to Son
虚函数解析为对象的动态类型的相应函数,而不是非虚函数那样的静态类型:
Aba && one = Aba();
// static type: reference to Aba
// dynamic type of referenced object: Aba
因此,虚函数解析为定义为 Aba
成员的函数。
Aba && two = Son();
// static type: reference to Aba
// dynamic type of referenced object: Son
假设存在这样的定义,现在虚函数将解析为 Son
中的定义。
这里是用静态对象调用函数h
,因此这个函数的调用只在编译时解析,与它无关功能是虚拟的。此调用已绑定。
仅在动态对象的情况下,绑定在运行时完成,查看指针指向哪个对象。
Aba *ptr = new Son;
ptr->h(); //Ptr is pointing to Son, hence Son::h() will get called.