gpt4 book ai didi

c++ - 调用基类方法而不是子类中的方法

转载 作者:行者123 更新时间:2023-11-28 05:45:09 29 4
gpt4 key购买 nike

我创建了一个 BaseClass 和两个子类:SubOneSubTwo。之后,我创建了一个名为 MyCollection 的集合,它将实例存储在一个 vector 中。

基类和子类都有方法getString。基类返回 base,子类返回 sub1sub2

我在编译过程中没有收到任何警告或错误。但出于某种原因,如果我尝试遍历 vector ,子类将返回“base”

#include <iostream>
#include <vector>

class BaseClass {

public:

BaseClass() {}

std::string getString() {
return "base";
}

};

class SubOne : public BaseClass {

public:

SubOne() : BaseClass() {}

std::string getString() {
return "sub1";
}

};

class SubTwo : public BaseClass {

public:

SubTwo() : BaseClass() {}

std::string getString() {
return "sub2";
}

};

class MyCollection {

private:

std::vector<BaseClass> instances;

public:

MyCollection() {}


void add(BaseClass & ins) {
instances.push_back(ins);
}

std::string printString() {

for(std::vector<BaseClass>::iterator it = instances.begin() ; it != instances.end(); ++it) {
std::cout << it->getString() << std::endl;
}

}

};

int main() {

MyCollection *coll = new MyCollection();

SubOne* s1 = new SubOne();
SubTwo* s2 = new SubTwo();

coll->add(*s1);
coll->add(*s2);

coll->printString();

return 0;

}

最佳答案

您忘记使用关键字 virtual。也翻译成指针(归功于长颈鹿船长)。

见下面的代码:

#include <iostream>
#include <vector>

class BaseClass {

public:

BaseClass() {}

virtual std::string getString() { // BINGO _!_!_!_!
return "base";
}

};

class SubOne : public BaseClass {

public:

SubOne() : BaseClass() {}

std::string getString() {
return "sub1";
}

};

class SubTwo : public BaseClass {

public:

SubTwo() : BaseClass() {}

std::string getString() {
return "sub2";
}

};

class MyCollection {

private:

std::vector<BaseClass*> instances;

public:

MyCollection() {}


void add(BaseClass* ins) {
instances.push_back(ins);
}

std::string printString() {

for(std::vector<BaseClass*>::iterator it = instances.begin() ; it != instances.end(); ++it) {
std::cout << (*it)->getString() << std::endl;
}

}

};

int main() {

MyCollection *coll = new MyCollection();

SubOne* s1 = new SubOne();
SubTwo* s2 = new SubTwo();

coll->add(s1);
coll->add(s2);

coll->printString();

return 0;

}

关于c++ - 调用基类方法而不是子类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365325/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com