初学虚函数,定义了virtual,却实现不了多态,输出的还是父类的东西,怎么处理?求!重谢!
初学虚函数,定义了virtual,却实现不了多态,输出的还是父类的东西,怎么办?急求!!!!重谢!!!!!!
这个是Access.h的头文件
这个是cpp的代码
本来希望它输出的是Screen Protector
可是怎么都输出heheda,
搞不明白啊,定义了虚函数,子类也重写了虚函数,为什么调用的时候还是调用的父类的??
真的很急!!求各位大神帮忙!!感激不尽!!!
------解决思路----------------------
因为如果在push函数中不传递引用,那么久是传递的一个对象的拷贝,所以你传递进去的根本就没有改变原对象。所以传递引用才是对的。
------解决思路----------------------
主要是STL中Vector是非侵入式的。
可以将
vector<Access>
改为
vector<Access*>
------解决思路----------------------
这个是Access.h的头文件
#include<string>
class Access{
friend ostream& operator<<(ostream& o,Access& s);
protected:
double price;
virtual string print();
public:
Access(double p=0):price(p){}
double getPrice(){ return price;}
};
class Screen:public Access{
public:
Screen():Access(19){ }
string print();
};
这个是cpp的代码
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include"Access.h"
using namespace std;
class Access;
ostream& operator<<(ostream& o,Access& s);
class Info{
private:
vector<Access> access;
public:
void add(Access& a);
void getInfo();
};
void Info::add(Access& a){
access.push_back(a);
};
void Info::getInfo(){
vector<Access>::iterator iter;
for(iter=access.begin();iter<access.end();++iter){
cout<<(*iter);
}
}
string Access::print(){
return "heheda";
}
string Screen::print(){
return "Screen Protector";
}
ostream& operator<<(ostream& o,Access& s){
o<<s.print();
return o;
}
void main(){
Info info;
Screen s;
info.add(s);
info.getInfo();
}
本来希望它输出的是Screen Protector
可是怎么都输出heheda,
搞不明白啊,定义了虚函数,子类也重写了虚函数,为什么调用的时候还是调用的父类的??
真的很急!!求各位大神帮忙!!感激不尽!!!
------解决思路----------------------
因为如果在push函数中不传递引用,那么久是传递的一个对象的拷贝,所以你传递进去的根本就没有改变原对象。所以传递引用才是对的。
------解决思路----------------------
主要是STL中Vector是非侵入式的。
可以将
vector<Access>
改为
vector<Access*>
------解决思路----------------------
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include"Access.h"
#include "stdio.h"
using namespace std;
class Access;
ostream& operator<<(ostream& o,Access& s);
class Info{
private:
vector<Access *> access;
public:
void add(Access* a);
void getInfo();
};
void Info::add(Access* a){
access.push_back(a);
};
void Info::getInfo(){
vector<Access*>::iterator iter;
for(iter=access.begin();iter<access.end();++iter){
cout<<(**iter);
}
}
string Access::print(){
return "heheda";
}
string Screen::print(){
return "Screen Protector";
}
ostream& operator<<(ostream& o,Access& s){
o<<s.print();
return o;
}
void main(){
Info info;
Screen s;
info.add(&s);
info.getInfo();
getchar();
}