子类不重写纯虚函数,那么这个子类也是抽象类吗,请用代码讲解
时间: 2024-03-12 15:49:28 浏览: 19
是的,如果一个子类不重写其父类的纯虚函数,那么这个子类也是一个抽象类,无法实例化对象。
以下是一个示例代码来说明这一点:
```
class AbstractClass {
public:
virtual void doSomething() = 0; // 纯虚函数
};
class ConcreteClass : public AbstractClass {
// 没有重写 doSomething 函数
};
int main() {
// AbstractClass abstract; // 编译错误,抽象类无法实例化对象
ConcreteClass concrete; // 编译通过,ConcreteClass 是 AbstractClass 的子类,但是也是抽象类
return 0;
}
```
在上面的代码中,`AbstractClass` 是一个抽象类,因为它有一个纯虚函数 `doSomething()`。`ConcreteClass` 继承自 `AbstractClass`,但是没有重写 `doSomething()` 函数,因此它也是一个抽象类。在 `main()` 函数中,我们尝试实例化 `AbstractClass` 对象,但是编译会报错。虽然 `ConcreteClass` 继承了 `AbstractClass`,但是它也是一个抽象类,不能实例化对象。
相关问题
子类不重写该方法的话this调用的是子类还是抽象类
如果子类没有重写抽象类中的非抽象方法,并且在抽象类的另一个方法中使用了 this.方法 来调用这个非抽象方法,那么实际上调用的是抽象类中定义的方法。
具体来说,如果抽象类中的非抽象方法没有被子类重写,在子类对象中调用该方法时,实际上会调用抽象类中定义的方法。这是因为在 Java 中,方法调用是基于实际对象类型的动态绑定(dynamic binding),即根据实际对象类型来确定要调用的方法。
例如,假设有一个抽象类 Animal,它有一个非抽象方法 eat(),实现如下:
```java
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating...");
}
public void play() {
this.eat();
}
}
```
在这个例子中,play() 方法调用了 this.eat() 来调用 eat() 方法。如果具体的子类 Cat 没有重写 eat() 方法,那么在 Cat 对象中调用 play() 方法时,实际上会调用 Animal 类中定义的 eat() 方法。
```java
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
```
在这个例子中,Cat 类没有重写 eat() 方法,因此在 Cat 对象中调用 play() 方法时,输出结果将为 "Cat is eating...",调用的是 Animal 类中定义的 eat() 方法。
如果父类不使用虚函数,那么子类能重写父类的函数吗
如果父类没有将需要被子类重写的函数声明为虚函数,那么子类就不能通过重写该函数来改变其行为。在没有使用虚函数的情况下,父类的函数实现会被子类继承,但子类无法在不修改父类源代码的情况下改变该函数的行为。
如果你想在不使用虚函数的情况下允许子类修改函数的行为,可以使用模板方法模式。该模式可以在父类中定义一个模板方法,该方法调用一系列抽象方法,然后在子类中重写这些抽象方法以实现自定义行为。
以下是一个使用模板方法模式的示例:
```cpp
class Parent {
public:
void doSomething() {
// 调用抽象方法
doSomethingImpl();
}
protected:
// 定义抽象方法
virtual void doSomethingImpl() = 0;
};
class Child : public Parent {
protected:
void doSomethingImpl() override {
// 子类的实现
}
};
```
在上面的示例中,`Parent` 类定义了一个模板方法 `doSomething()`,该方法调用了抽象方法 `doSomethingImpl()`。在 `Child` 类中,重写了 `doSomethingImpl()` 方法以实现自定义行为。这样,即使 `Parent` 类中的 `doSomething()` 方法没有被声明为虚函数,`Child` 类也能修改其行为。