如何解决为什么我要实现虚函数而不在抽象类中实现?
很抱歉,我不得不问一个愚蠢的问题。
我理解实现抽象类的好处。如果我有一个带有基本实现的虚函数,并且在派生类没有特定实现的情况下总是被调用,那么肯定会有好处,例如
virtual void ImplementedVirtFunc() {//do something basic}
我不太明白的是实现纯虚函数有什么好处,例如
virtual void VirtFunc() = 0;
在这种情况下,如果需要,我的派生类无论如何都需要实现专门化的函数。但是我可以直接在那里实现它并省略抽象类中的 virtual void VirtFunc() = 0
行。
那么实施 virtual void VirtFunc() = 0
是否有我没有看到的特定好处?
请原谅我这个愚蠢的问题。我今年 1 月开始学习 C++,但要了解所有细微之处还有很长的路要走...
解决方法
但我可以直接在那里实现它并省略抽象类中的 virtual void VirtFunc() = 0 行。
当然可以。但是您将无法从您的基类调用该方法,因为您的基类根本不知道它的存在。
考虑以下示例。每个 Shape
肯定有一个区域,即使不以一般形状而闻名。 Shape
的每个子类都继承了 Print()
方法。
class Shape {
// ...
public:
virtual int Area() = 0; // there is no formula for the area of a "general" shape,but it definitely has one ...
virtual void Print() {
std::cout << "Area: " << Area() << std::endl;
}
}
class Circle : public Shape {
// ...
public:
virtual int Area() {
// calculate and return circle area
}
}
class Square : public Shape {
// ...
public:
virtual int Area() {
// calculate and return square area
}
}
,
有两个原因。
一种是强制派生的具体类来实现您的虚函数。
二是让你的类成为抽象类,不能自己实例化。
virtual void f(); // virtual member function
virtual void g() = 0; // pure abstract member function
具有至少一个纯虚成员函数的类是一个抽象类,不能自己构造,这通常是需要的(只有非抽象,“具体" 如果愿意,应该可以构造派生类);
struct Abstract {
virtual void g() = 0;
};
struct NonAbstract {
virtual void f() {}
};
int main() {
NonAbstract na{}; // OK
Abstract a{}; // Error: cannot declare variable 'a'
// to be of abstract type 'Abstract'
}
抽象类通常以多态方式使用,以允许动态分派到派生对象方法:
struct Derived : public Abstract {
void g() override {} // #1
}
void h(Abstract const& obj) {
obj.g(); // dynamic dispatch
}
int main() {
Derived d{};
h(d); // Will result in invoke #1
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。