返回信息流#include<iostream>
using namespace std;
class A
{
public:
virtual char* getName()
{
return "AName";
};
virtual char* getValue()
{
return "AValue";
};
};
class B : public A
{
public:
static char* getName()
{
return "BName";
};
char* getValue()
{
return "BValue";
};
};
void main()
{
A *a=new B();
cout<<a->getName()<<'&'<<a->getValue()<<endl;
}
请问为什么结果为AName&BValue,谢谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #31493同步于 2009/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于虚继承和static的问题
mysterious03
2009/11/17镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 mysterious03 的大作中提到: 】
: #include<iostream>
: using namespace std;
: class A
: ...................
汗……这个就是传说中的 虚继承 啊[em16]
我知道用了static,但是不知道原理^_^
麻烦详细解释一下,谢谢!
【 在 ericyosho 的大作中提到: 】
: 因为你static了。@@
我是在Visual C++环境下编译通过了
对为什么是AName不懂
【 在 ericyosho 的大作中提到: 】
: 话说,LZ是哪个不懂,是为什么出现AName不懂,还是为什么出现BValue不懂?
【 在 mysterious03 的大作中提到: 】
: 我是在Visual C++环境下编译通过了
: 对为什么是AName不懂
小妹你好,你的来信我已收到,现在我就你提问的问题做出简略的回答,如果还有什么疑问,可以每天凌晨零点 CCSV 《午夜男人午夜心》进行电话咨询[em20]
好,回归正题~~
现在假设 编译器编译通过。
那么,虚函数的调用是通过 虚函数表 间接调用的,所以 要实现多态, 子类必然要用相应的函数指针替换掉 父类 相应的虚函数的指针。
但是,现在B类的getName() 已经是静态的函数了,注意,这样的声明已经跟A类相应的函数声明是完全不一样的,c++经过名称修饰后两者已经根本上是两个不同的函数了。因为是静态的,所以已经不会把用该静态函数指针来替换掉虚函数表相应虚函数的指针了,所以,最终的结果当然是不会产生多台了~~~
PS. 手好酸,为了表示奖赏,叫我声大哥吧[em17]
因为要想进行虚函数的调用,必须要保证,在子类中的函数签名和父类中的函数签名完全相同,才能进行多态调用。
即使是这样的两个函数,都是不允许多态的。
class A {
public:
virtual void f() {return “A”};
};
class B : public A {
public:
void f() const {return “B”};
};
虽然只加了个const,而且函数确实没有改变对象本身,但是函数签名发生了变化,无法多态调用。
更何况static还不只是这样,用了static,就变成了类函数,差别更加大了。
大哥你好~
【 在 jmpesp (垃圾|人渣|缅甸果敢第一司令) 的大作中提到: 】
: 小妹你好,你的来信我已收到,现在我就你提问的问题做出简略的回答,如果还有什么疑问,可以每天凌晨零点 CCSV 《午夜男人午夜心》进行电话咨询[em20]
: 好,回归正题~~
: 现在假设 编译器编译通过。
: ...................