为什么不调用子类方法?

问题描述:

我有子类和使用方法的问题。为什么不调用子类方法?

我创建类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; 
} 
+3

声明的'F()'方法是虚拟的。用于在运行时延迟响应。否则静态binging – 2013-02-18 15:09:38

+0

是啊,因为它不是虚拟的 – 2013-02-18 15:11:43

f()需求:

class A { 
public: 
    virtual void f() { 
     cout << "A"; 
    } 
}; 

你已经有可能默认为虚拟方法工作的其他语言,但C++不(不支付你不要什么不使用:虚拟方法在调用它们时会产生间接性,这意味着它们比正常方法调用稍慢)。

通过添加virtual,结合将被推迟到运行时(称为dynamic binding),并且f()函数调用将在类型的值的决定。

因为你还没有声明的函数f()虚拟,结合是静态的(在编译时),并且将使用类型的变量(但不是值),以确定哪些f()打电话。所以在你现在的代码表中a->f();调用A类的f(),因为a是指向A类的指针。

+2

+1为好的解释:) – LihO 2013-02-18 15:15:04

+1

@GrijeshChauhan谢谢你的额外精度。 – syam 2013-02-18 15:35:01

为了实现多态行为,基类的方法必须是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; 
} 
+1

当一个子类提供了一个已经在基类中定义的方法的实现时,它是[**方法覆盖**](http://en.wikipedia.org/wiki/Method_overriding)不会超载。 – LihO 2013-02-18 15:24:22