在学习Java之后,我对用C ++实现对象定向感到困惑。
上了课:
class Car {
int weight;
public:
Car(int input) {
weight = input;
}
void sayVroem() {
std::cout << "Vroem...";
}
};
在Java中,我可以通过将其声明为public abstract class Car
来声明一个抽象类。这将导致无法实例化该类。在c ++中可能有类似的东西吗?
答案 0 :(得分:4)
您需要至少声明一种纯虚拟的方法,例如:
class Car {
int weight;
public:
Car(int input) {
weight = input;
}
void sayVroem() {
std::cout << "Vroem...";
}
virtual void ImAPureVirtualMethod() = 0;
};
如果您没有虚拟方法
class Car {
int weight;
public:
void sayVroem() {
std::cout << "Vroem...";
}
protected:
Car () = default;
};
或者通过使析构函数成为纯虚像
class Car {
int weight;
public:
Car(int input) {
weight = input;
}
void sayVroem() {
std::cout << "Vroem...";
}
virtual ~Car() = 0;
};
使用虚拟描述符时要注意的一件事是,当派生类被破坏时,它将调用基类描述符,因此您将需要提供一个实现,例如:
inline Car::~Car() { }
有很多东西描述这个:
https://en.cppreference.com/w/cpp/language/abstract_class
https://www.geeksforgeeks.org/pure-virtual-functions-and-abstract-classes/
答案 1 :(得分:2)
显式执行此操作的最简单方法是将所有构造函数声明为protected =>这样,即使没有纯虚拟成员,也无法实例化该类。
在您的情况下:
class Car {
int weight;
protected: // only derived classes can access those functions
Car(int input) {
weight = input;
}
// if you just have the default c-tor you can move it to protected like this:
Car() = default;
public:
void sayVroem() {
std::cout << "Vroem...";
}
// feel free to add virtual methods later on if required
};
答案 2 :(得分:0)
您是否尝试过在线搜索? 我没有使用C ++,但是研究似乎很容易,并且有很多答案。