2012-04-05 83 views
3

类DVD继承类媒体,有一个比基类更多的变量。如何调用基类(而不是抽象)重载函数?

我声明指针:

Media* ptr = new DVD(...); 

我想打印出DVD的内容,所以下面的代码按预期工作:

ptr->print(cout); 

但仅使用重载< <运营商调用基类print()函数:

cout << *ptr << endl; 

因此它仅打印出ID,而不打印导演的名字。要解决这个问题

一种方法是修改过载< <操作了一下,使其接受指针,所以:

cout << ptr << endl; 

应该工作,但不知何故,我必须找到使cout << *ptr << endl;工作结合的方式预期。

有什么建议吗?

事情是我不能做基类(媒体)摘要,因为我需要在重载ostream操作符中调用它的一个实例,所以基类的指针不能调用派生的重载函数类,它指向。

代码:

#include <iostream> 
using namespace std; 

class Media{ 
    private: 
     int id; 
    public: 
     Media(int _id) : id(_id) {} 
     virtual ~Media(); 
     virtual void print(ostream &out); 
     friend ostream& operator << (ostream& out, Media aMedia); 
}; 
Media::~Media(){} 

class DVD : public Media { 
    private: 
     string director; 
    public: 
     DVD(int _id, string _director = "unknown") : Media(_id), director(_director) {} 
     ~DVD(); 
     void print(ostream &out); 
}; 
DVD::~DVD(){} 

void Media::print(ostream& out){ 
    out << "ID " << id; 
} 
void DVD::print(ostream& out){ 
    out << "DVD: "; 
    Media::print(out); 
    out << " Directed by " << director; 
} 
ostream& operator << (ostream& out, Media aMedia){ 
    aMedia.print(out); 
    return out; 
} 

int main() { 
    Media *ptr = new DVD(352, "Stephen Spielberg"); 
    ptr->print(cout); // Prints out: "DVD: ID 352 Directed by Stephen Spielberg". Correct! 
    cout << endl; 
    cout << *ptr << endl; //Prints out: "ID 352" Incorrect! 
} 

回答

1

问题在此声明ostream& operator << (ostream& out, Media aMedia)。您正在接受参数aMedia通过复制导致对象切片,通过使用引用更改签名接受它ostream& operator << (ostream& out, const Media& aMedia)

由于切片的,当你做cout << *ptr,一个复制DVD创建Media型的(即DVD切片为媒体),现在当你调用print,因为对象的类型是Media呼叫转到到Media::print。你可以阅读更多关于对象切片here

+0

所有的好,我从来没有明白为什么我们应该在重载函数中使用const引用,而不是仅仅使用变量本身,但现在都清楚了。谢谢! – 2012-04-05 10:30:36

1

或引用媒体&传递到阿兹马特< <,这样会出现虚拟调度。

您正在直接传递一个媒体对象,这意味着将创建一个DVD对象的新副本,并且只有DVD的部分将被丢弃,并且只是其媒体部分将以aMedia参数结束。

看到:

ostream& operator << (ostream& out, const Media& aMedia){ 
    aMedia.print(out); 
    return out; 
} 
+1

最好让它成为一个常量引用。 – Henrik 2012-04-05 10:18:29

+0

好点,做 – 2012-04-05 10:20:25

+0

所有的好,我从来没有明白为什么我们应该在重载函数中使用const引用,而不是仅仅使用变量本身,但现在都清楚了。 谢谢! – 2012-04-05 10:24:56

相关问题