C++ - 从抽象对象创建非抽象对象
C++ - Creating non-abstract objects from abstract objects
我有这个基类
class Object {
...
public:
virtual void move() = 0;
virtual void move(string) = 0;
virtual void powerOn() = 0;
virtual void powerOff() = 0;
virtual void speak() = 0;
};
这将是不同类的基类
class Electronics : public Object {
...
public:
virtual void powerOn();
virtual void powerOff();
};
void Electronics::powerOn() { ... }
void Electronics::powerOff() { ... }
class Phone : public Electronics {
...
public:
};
现在,如果我想创建一个对象 Phone,它使用 powerOn(( 和 powerOff(( 方法。我不需要其他三种方法。
Object *obj = new Phone;
但这可能会给我一个错误说
undefined reference to move()
undefined reference to move(string)
undefined reference to speak()
我的问题是,如何避免此错误。Phone不需要这些功能,但它需要我用它们做一些事情。如何克服此错误?
谢谢
您可以在Electronics
或Object
中提供这些虚拟方法的空实现(使方法非抽象(。或者,如果两者都需要这样,则需要在 Phone
中重新实现它们。但是,您不能将它们"隐藏"在Phone
中,除非您将它们从其底座中删除。
如前所述,您可以在 Electronics
类中创建它们的空实现,换句话说,覆盖此类中的方法,并简单地让它有一个空的主体。(请参阅此处的示例:http://ideone.com/jM2hX7(
#include <iostream>
using namespace std;
class Object {
public:
virtual void move() = 0;
virtual void move(string) = 0;
virtual void powerOn() = 0;
virtual void powerOff() = 0;
virtual void speak() = 0;
};
class Electronics : public Object {
public:
virtual void move() override {}
virtual void move(string) override {}
virtual void powerOn() override {cout << "powerOn" << endl;}
virtual void powerOff() override {cout << "powerOff" << endl;}
virtual void speak() override {}
};
class Phone : public Electronics {
virtual void powerOn() override {cout << "phone:powerOn" << endl;}
virtual void powerOff() override {cout << "phone:powerOff" << endl;}
};
int main() {
Object* phone = new Phone;
phone->move();
phone->powerOn();
phone->powerOff();
phone->speak();
delete phone;
return 0;
}
输出:
phone:powerOn
phone:powerOff
更重要的是,虽然你可能想重新考虑你的类设计,但真的有必要拥有纯虚拟方法,如powerOn
、powerOff
、speak
、......在你的班级里:Object
.对象听起来很通用,这些功能听起来更具体。 理想情况下,Object
应该只包含对从它继承的所有类有意义的函数。
这些函数在Electronics
类中可能更有意义,即使这样,似乎也有点太笼统了。
如果确实需要在Object
类中包含这些对象,那么我个人会将其重命名为更多的说法。
相关文章:
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 打印抽象对象 c++
- E0322:不允许使用抽象类类型 " " 的对象
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 从从该抽象类派生的 Python 对象强制转换C++抽象类C++
- 将抽象对象从主线程发送到其他线程
- C++ 将一组对象传递给抽象类的成员函数
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 无法分配抽象类型为"解析器"的对象
- 在多个对象上执行同一语句的零成本抽象
- 分配抽象类类型 c++ xcode 的对象
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- C++ abort() 在函数内的抽象类对象指针调用上
- 复制从抽象类派生的对象
- 分配抽象类类型为"CObject"的对象
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 错误:不允许使用抽象类类型的对象
- 使用抽象类的类和实现此抽象类的创建对象