我是 C++ 的新手,并且已经开始致力于从基类调用虚拟方法并使用指针来取消引用它们。这是一个简单的程序,它有一个基类哺乳动物和许多派生类(例如狗和猫),并要求用户提供相应的数字来调用虚拟方法,该方法根据所选的类输出“woof”或“meow”。我按照出版的书中的所有代码进行操作,但仍然无法获得我想要的输出。
#include <iostream>
using namespace std;
enum BOOL {True, False};
class mammal {
public:
mammal():itsAge(1) {
}
~mammal() {}
virtual void Speak() const {
cout << "Mammal speak! " << endl;
}
protected:
int itsAge;
};
class dog : public mammal {
public:
void Speak() const {
cout << "woof" << endl;
}
};
class cat : public mammal {
public:
void speak() {
cout << "meow!" << endl;
}
};
void ValueFunction(mammal);
void ptrFunction(mammal*);
void RefFunction(mammal&);
int main() {
mammal* ptr = 0;
int choice;
while(1) {
BOOL fQuit = False;
cout << "(1)Dog, (2)Cat, (0)Quit: " << endl;
cin >> choice;
switch (choice) {
case 0: fQuit = True;
break;
case 1: ptr = new dog;
break;
case 2: ptr = new cat;
break;
}
if (fQuit)
break;
ptrFunction(ptr);
RefFunction(*ptr);
ValueFunction(*ptr);
}
return 0;
}
void ValueFunction (mammal mammalValue) {
mammalValue.Speak();
void ptrFunction(mammal* pMammal) {
pMammal->Speak();
void RefFunction(mammal& rMammal) {
rMammal.Speak();
}
我去运行这个并得到:“(1)狗,(2)猫,(0)退出:”并输入了所有选项(1、2和3),但没有得到任何回报。但是,我有一个警告代码 C6011,因为我取消引用了空指针。我尝试过只使用哺乳动物* ptr = 新哺乳动物;仍然没有任何工作。在此提供帮助将不胜感激。
您的代码的主要问题是:
cat 类中大小写不匹配: cat 类中的方法 talk 是小写的,但它应该与基类中的虚方法 Speak 匹配。由于 C++ 区分大小写,所以 talk 不会覆盖 Speak。 修复:将speak重命名为Speak in the cat class。
使用 override 关键字: 将 override 关键字添加到您的重写方法中(用狗和猫说话),以确保它们与基类签名匹配并避免类似的错误。
示例:
class dog : public mammal {
public:
void Speak() const override { // Signals this overrides base Speak
cout << "woof" << endl;
}
};
class cat : public mammal {
public:
void Speak() const override {
cout << "meow!" << endl;
}
};
空指针取消引用警告: 如果用户输入无效输入,ptr 仍为空并导致 ptrFunction 中空指针取消引用。在分配 ptr 后添加检查以确保它不为空。
ValueFunction、ptrFunction 和 RefFunction 定义中的括号错误: 这些函数缺少右大括号。修复此问题以使代码可以编译。
ValueFunction 中的多态复制问题: 按值传递将派生类对象切片为基类对象,从而失去多态性。避免多态行为的值传递;请改用引用或指针。
修复:删除 ValueFunction 或通过引用传递