为什么我要在抽象 class 中实现虚函数而不实现?
Why would I want to implement virtual functions without implementation in an abstract class?
对不起,我不得不问一个愚蠢的问题。
我理解这样实现抽象 class 的好处。如果我有一个带有基本实现的虚函数,在派生的 classes 没有特定实现的情况下总是调用它,那肯定是有好处的,例如
virtual void ImplementedVirtFunc() {//do something basic}
我不太明白的是实现纯虚函数有什么好处,比如
virtual void VirtFunc() = 0;
在这种情况下,如果需要,我派生的 classes 无论如何都需要实现专门化的功能。但是我可以直接在那里实现它并在我的摘要 class.
中省略 virtual void VirtFunc() = 0
行
那么实施 virtual void VirtFunc() = 0
是否有我没有看到的特定好处?
请原谅我这个愚蠢的问题。我今年一月开始学习 C++,但我还有很长的路要走...
virtual void f(); // virtual member function
virtual void g() = 0; // pure abstract member function
具有至少一个纯虚成员函数的class是一个抽象class,并且不能自己构建,这通常是需要的(只有非抽象的,“具体的”,如果你愿意,派生 classes 应该能够被构建);
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'
}
抽象 classes 通常以多态方式使用,以允许动态分派派生对象方法:
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
}
But I could straight forwardly just implement it there and omit the virtual void VirtFunc() = 0 line in my abstract class.
当然可以。但是您将无法从您的基 class 调用该方法,因为您的基 class 根本不知道它的存在。
考虑以下示例。每个 Shape
肯定有一个区域,即使不知道一般形状。 Shape
的每个 subclass 都继承了 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
}
}
有两个原因。
一种是 force 派生具体 class 来实现你的虚函数。
二是让你的class成为抽象的class,不能自己实例化
对不起,我不得不问一个愚蠢的问题。
我理解这样实现抽象 class 的好处。如果我有一个带有基本实现的虚函数,在派生的 classes 没有特定实现的情况下总是调用它,那肯定是有好处的,例如
virtual void ImplementedVirtFunc() {//do something basic}
我不太明白的是实现纯虚函数有什么好处,比如
virtual void VirtFunc() = 0;
在这种情况下,如果需要,我派生的 classes 无论如何都需要实现专门化的功能。但是我可以直接在那里实现它并在我的摘要 class.
中省略virtual void VirtFunc() = 0
行
那么实施 virtual void VirtFunc() = 0
是否有我没有看到的特定好处?
请原谅我这个愚蠢的问题。我今年一月开始学习 C++,但我还有很长的路要走...
virtual void f(); // virtual member function
virtual void g() = 0; // pure abstract member function
具有至少一个纯虚成员函数的class是一个抽象class,并且不能自己构建,这通常是需要的(只有非抽象的,“具体的”,如果你愿意,派生 classes 应该能够被构建);
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'
}
抽象 classes 通常以多态方式使用,以允许动态分派派生对象方法:
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
}
But I could straight forwardly just implement it there and omit the virtual void VirtFunc() = 0 line in my abstract class.
当然可以。但是您将无法从您的基 class 调用该方法,因为您的基 class 根本不知道它的存在。
考虑以下示例。每个 Shape
肯定有一个区域,即使不知道一般形状。 Shape
的每个 subclass 都继承了 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
}
}
有两个原因。
一种是 force 派生具体 class 来实现你的虚函数。
二是让你的class成为抽象的class,不能自己实例化