在面向对象编程中,抽象类是一种特殊的类,它不能被实例化,只能被其他类继承。抽象类通常用来定义一组子类的通用接口和行为。将抽象类作为函数参数传递并在原始类超出作用域后使用,涉及到多态性和对象生命周期管理。
= 0
),表示该函数必须在子类中实现。abstract
关键字声明,子类必须实现这些方法。#include <iostream>
#include <memory>
// 抽象类
class AbstractClass {
public:
virtual void doSomething() = 0; // 纯虚函数
virtual ~AbstractClass() = default;
};
// 具体类
class ConcreteClass : public AbstractClass {
public:
void doSomething() override {
std::cout << "ConcreteClass doing something" << std::endl;
}
};
// 函数接受抽象类指针
void process(AbstractClass* obj) {
obj->doSomething();
}
int main() {
std::unique_ptr<AbstractClass> ptr = std::make_unique<ConcreteClass>();
process(ptr.get()); // 传递抽象类指针
return 0;
}
// 抽象类
abstract class AbstractClass {
abstract void doSomething(); // 抽象方法
}
// 具体类
class ConcreteClass extends AbstractClass {
@Override
void doSomething() {
System.out.println("ConcreteClass doing something");
}
}
// 函数接受抽象类对象
public static void process(AbstractClass obj) {
obj.doSomething();
}
public static void main(String[] args) {
AbstractClass obj = new ConcreteClass();
process(obj); // 传递抽象类对象
}
问题:在原始类超出作用域后,如何确保对象仍然有效?
原因:当对象超出其作用域时,默认情况下会被销毁,可能导致悬空指针或引用。
解决方法:
std::unique_ptr
或std::shared_ptr
)管理对象的生命周期。std::vector
、std::map
)管理对象集合,确保对象在需要时有效。通过上述方法,可以有效地将抽象类作为函数参数传递,并在原始类超出作用域后继续使用对象。
领取专属 10元无门槛券
手把手带您无忧上云