c ++从超类中的子类调用方法
c++ calling method from subclass in superclass
我对 C++ 对象编程有点陌生,需要一点帮助。
假设我有 class 只动物和子 class 只猫。
在主程序中,我创建了一个指向 Animal 的指针数组,如下所示:
Animal* array[10];
array[0] = new Cat();
Subclass cat 有他自己的整数,方法 getType 到 return 那个整数。我想知道如何调用这个方法。
我试过了:
array[0]->getType()
但是它说,无法解析该方法,并且 classAnimal 没有名为 getType 的成员。
我也试过使这个方法虚拟化,但仍然没有用。
有什么解决办法吗?
此致
如果我没记错的话,您需要将数组[0] 转换为 Cat 类型。所以它会像这样
dynamic_cast<Cat>(array[0])->getType();
这是我的第一个 post,我还没有尝试过我的建议,所以如果这是错误的,我深表歉意。
您需要 Cat *
才能调用 getType()
。在 C++ 中,使用 casting operators.
转换(转换)指针
如果您确定(在较大的程序中这会反咬一口)您的 array[0]
确实指向 class Cat
的对象,您可以使用(参见 ideone 完整程序)
Cat * catPtr = static_cast<Cat *>(array[0]);
catPtr->getType();
或者,简而言之,
static_cast<Cat *>(array[0])->getType();
请注意,如果 array[0]
不是指向 Cat
的指针,这将失败得很惨。
只要您的 classes 是多态的(包含虚拟成员),在您的情况下(基本 class 指针数组和 运行 派生方法)应该是在这种情况下,您可以使用 dynamic_cast
而不是 static_cast
。它会产生运行时开销,但会检查转换是否有效,如果无效则 return nullptr
。
您需要在基class中将其声明为虚函数,示例:
virtual void getType() { cout << "Animal" << '\n'; }
并且在派生的 class 中您可以覆盖它:
void getType() override { cout << "Cat" << '\n'; }
现在您可以调用 array[0]->getType()
,它将使用覆盖的 Cat::getType()
在我看来你想要 Animal
的多个子classes,它们将具有相同的方法并且你将使用 Animal *
的数组来调用子classes 的方法。如果是这种情况,那么你应该制作 Animal
class 方法 virtual
:
- 在
Animal
class 中声明所有方法(您希望所有子class 拥有)
- 如果他们有 "default" 实施,请将其放入
Animal
- 否则,在
Animal
中将它们设为纯虚拟(参见示例)
- 在 subclasses 中,覆盖纯虚拟方法以及那些将具有非默认实现的方法
所以你的 Animal
class 应该是这样的:
class Animal {
public:
virtual int getType() = 0; // purely virtual function
};
和您的 Cat
class 应该覆盖这些方法(请注意 override
标识符不是必需的,尽管推荐)
class Cat : public Animal {
public:
int getType() override {
return 42;
}
};
这允许
Animal * array[10];
array[0] = new Cat();
std::cout << array[0]->getType() << std::endl;
这将打印 42。参见 ideone example。
我对 C++ 对象编程有点陌生,需要一点帮助。
假设我有 class 只动物和子 class 只猫。 在主程序中,我创建了一个指向 Animal 的指针数组,如下所示:
Animal* array[10];
array[0] = new Cat();
Subclass cat 有他自己的整数,方法 getType 到 return 那个整数。我想知道如何调用这个方法。
我试过了:
array[0]->getType()
但是它说,无法解析该方法,并且 classAnimal 没有名为 getType 的成员。 我也试过使这个方法虚拟化,但仍然没有用。 有什么解决办法吗?
此致
如果我没记错的话,您需要将数组[0] 转换为 Cat 类型。所以它会像这样
dynamic_cast<Cat>(array[0])->getType();
这是我的第一个 post,我还没有尝试过我的建议,所以如果这是错误的,我深表歉意。
您需要 Cat *
才能调用 getType()
。在 C++ 中,使用 casting operators.
如果您确定(在较大的程序中这会反咬一口)您的 array[0]
确实指向 class Cat
的对象,您可以使用(参见 ideone 完整程序)
Cat * catPtr = static_cast<Cat *>(array[0]);
catPtr->getType();
或者,简而言之,
static_cast<Cat *>(array[0])->getType();
请注意,如果 array[0]
不是指向 Cat
的指针,这将失败得很惨。
只要您的 classes 是多态的(包含虚拟成员),在您的情况下(基本 class 指针数组和 运行 派生方法)应该是在这种情况下,您可以使用 dynamic_cast
而不是 static_cast
。它会产生运行时开销,但会检查转换是否有效,如果无效则 return nullptr
。
您需要在基class中将其声明为虚函数,示例:
virtual void getType() { cout << "Animal" << '\n'; }
并且在派生的 class 中您可以覆盖它:
void getType() override { cout << "Cat" << '\n'; }
现在您可以调用 array[0]->getType()
,它将使用覆盖的 Cat::getType()
在我看来你想要 Animal
的多个子classes,它们将具有相同的方法并且你将使用 Animal *
的数组来调用子classes 的方法。如果是这种情况,那么你应该制作 Animal
class 方法 virtual
:
- 在
Animal
class 中声明所有方法(您希望所有子class 拥有)
- 如果他们有 "default" 实施,请将其放入
Animal
- 否则,在
Animal
中将它们设为纯虚拟(参见示例) - 在 subclasses 中,覆盖纯虚拟方法以及那些将具有非默认实现的方法
所以你的 Animal
class 应该是这样的:
class Animal {
public:
virtual int getType() = 0; // purely virtual function
};
和您的 Cat
class 应该覆盖这些方法(请注意 override
标识符不是必需的,尽管推荐)
class Cat : public Animal {
public:
int getType() override {
return 42;
}
};
这允许
Animal * array[10];
array[0] = new Cat();
std::cout << array[0]->getType() << std::endl;
这将打印 42。参见 ideone example。