为什么不调用子类方法?
我有子类和使用方法的问题。为什么不调用子类方法?
我创建类B
的一个实例,并将其存储为指向A
的指针。但是当我使用指针调用重载方法时,输出是“A”而不是“B”。为什么?
这在其他语言的作品,我做错了什么?
#include <iostream>
using namespace std;
class A {
public:
void f() {
cout << "A";
}
};
class B : public A {
public:
void f() {
cout << "B";
}
};
int main() {
A *a = new B();
a->f();
return 0;
}
f()
需求:
class A {
public:
virtual void f() {
cout << "A";
}
};
你已经有可能默认为虚拟方法工作的其他语言,但C++不(不支付你不要什么不使用:虚拟方法在调用它们时会产生间接性,这意味着它们比正常方法调用稍慢)。
通过添加virtual
,结合将被推迟到运行时(称为dynamic binding),并且f()
函数调用将在类型的值的决定。
因为你还没有声明的函数f()
虚拟,结合是静态的(在编译时),并且将使用类型的变量(但不是值),以确定哪些f()
打电话。所以在你现在的代码表中a->f();
调用A
类的f()
,因为a
是指向A
类的指针。
为了实现多态行为,基类的方法必须是virtual
。
所以在class A
您需要将void f()
更改为virtual void f()
。要声明在基类virtual
的函数必须声明virtual
能够覆盖它:
#include <iostream>
using namespace std;
class A {
public:
virtual void f() {// Here you must define the virtual.
cout << "A";
}
};
class B : public A {
public:
virtual void f() { //Here the "virtual" is optional, but a good practice
cout << "B";
}
};
int main() {
A *a = new B();
a->f();
return 0;
}
当一个子类提供了一个已经在基类中定义的方法的实现时,它是[**方法覆盖**](http://en.wikipedia.org/wiki/Method_overriding)不会超载。 – LihO 2013-02-18 15:24:22
声明的'F()'方法是虚拟的。用于在运行时延迟响应。否则静态binging – 2013-02-18 15:09:38
是啊,因为它不是虚拟的 – 2013-02-18 15:11:43