2013-05-05 29 views
0

我有一个函数获取'A'的对象,它被称为:func。我发送它的一个对象B.发送一个儿子而不是父亲的对象

不应该激活B的构造函数吗?因为我送B的对象,虽然我要送A的对象我真的不知道为什么这个函数打印:

A() 
DESTRUCTOR A 

,而不是:

CONSTRUCTOR A 
CONSTRUCTOR B 
B() 
DESTRUCTOR B 
DESTRUCTOR A 

没有它具有因为func得到A a而不是A& a

这是我的代码:

class A 
{ 
    public: 
    A() { cout << "CONSTRUCTOR A\n"; } 
    ~A() { cout << "DESTRUCTOR A\n"; } 
    virtual void f() { cout << "A()" << endl; } 
}; 

class B: public A 
{ 
    public: 
    B() { cout << "CONSTRUCTOR B\n"; } 
    ~B() { cout << "DESTRUCTOR B\n"; } 
    virtual void f() { cout << "B()" << endl; } 
}; 

void func(A a) { 
    a.f(); 
} 

int main() { 
    B b; 
    func(b); 
    return 0; 
} 

回答

1

因为如果你送儿子,但功能要求的父类它把孩子作为一个父亲。

class A 
{ 
    public: 
    A() { cout << "CONSTRUCTOR A\n"; } 
    ~A() { cout << "DESTRUCTOR A\n"; } 
    virtual void f() { cout << "A()" << endl; } 
}; 

class B: public A 
{ 
    public: 
    B() { cout << "CONSTRUCTOR B\n"; } 
    ~B() { cout << "DESTRUCTOR B\n"; } 
    virtual void f() { cout << "B()" << endl; } 
}; 

void func(B a) { 
    a.f(); 
} 

int main() { 
    B b; 
    func(b); 
    return 0; 
} 

如果您尝试此代码,您会看到您期望的结果。

+0

它与切片有关吗? – 2013-05-05 17:28:42

+1

是啊!绝对 – Aryan 2013-05-05 17:36:42

1

我认为你感到困惑的原因是因为你是通过价值而不是指针。这就是为什么B对象被当作A处理的原因,因为func取值为A,默认情况下它将对象视为A,这也意味着正在调用错误的析构函数。运行此代码,您将更好地理解。

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
    A() { cout << "CONSTRUCTOR A\n"; } 
    ~A() { cout << "DESTRUCTOR A\n"; } 
    virtual void f() { cout << "A()" << endl; } 
}; 

class B: public A 
{ 
    public: 
    B() { cout << "CONSTRUCTOR B\n"; } 
    ~B() { cout << "DESTRUCTOR B\n"; } 
    virtual void f() { cout << "B()" << endl; } 
}; 

void func(A * a) { 
    a->f(); 
} 

int main() { 
    B * b = new B();; 
    cout << "\n"; 
    func(b); 
    cout << "\n"; 
    delete b; 
    return 0; 
} 

这基本上是虚函数的点,用你希望能够能够继承时,作为一个父类指针传递的一切。然而你想调用的方法是子类方法。当你按值传递时,对象必须被视为它传入的东西。

相关问题