重写C++中的方法

Override methods in C++

本文关键字:方法 C++ 重写      更新时间:2023-10-16

我应该创建一个基类(P2D)和一个派生类(P3D),前者表示二维中的点,后者表示三维中的点。在第一个类中,我这样创建了一个方法:

virtual istream& set(istream&); //sets the values
istream& P2D::set(istream& in){
    in >> x >> y;
    return in;
}

在第二类中:

istream& set(istream&); //sets the values
istream& P3D::set(istream& in){
    P2D::set(in); 
    in >> z;
    return in; 
}

在主函数中,我考虑将所有点(无论它们是二维还是三维)放在一个向量中,然后以某种方式使用上面的set方法将所有点设置在while循环中。这是一段有问题的代码:

vector<P2D*> points;
bool ans(true);
P2D* p;
while(ans){
    cout << "Insert a point" << endl;
    p->set();
    points.push_back(p);
    cout << "Do you want to insert another point? ";
    cin >> ans;
}

我知道这是错误的,我知道为什么,但有没有机会不使用普通记忆来克服这一点?如果用户想插入二维点或三维点,我是否被迫让他选择?

在我看来,这似乎被打破了,因为继承意味着"是一个"关系,而3D点肯定不是2D点。

这反映了你的问题,因为没有一种优雅的方法可以按照你的建议来做。IMO,用户必须决定是输入2D点还是3D点,但将其保留为2D点的集合仍然没有意义。

这完全取决于您以后对集合中的点要做什么。也许你应该有一个Point类型作为2D和3D点的父对象,但如果没有更大的上下文,很难判断。