是否可以在不实例化派生类的情况下调用该类的虚拟函数



我有两个类A和B,它们派生自一个抽象类Letter。在运行时,我想调用一个函数,该函数在派生类之间有所不同,具体取决于用户输入。以下代码执行我想要的功能:

Letter.h:

#pragma once
#include <iostream>
class Letter
{
public:
virtual void PrintAlphabetPosition() = 0;
virtual ~Letter(){};
};

A.h:

#include "Letter.h"
class A : public Letter
{
public:
virtual void PrintAlphabetPosition() { std::cout << "1" << std::endl; };
virtual ~A(){};
};

B.h:

#include "Letter.h"
class B : public Letter
{
public:
virtual void PrintAlphabetPosition() { std::cout << "2" << std::endl; };
virtual ~B(){};
};

main.cpp:

#include <iostream>
#include "Letter.h"
#include "A.h"
#include "B.h"
void main() {
Letter* letter;
char input;
std::cin >> input;
if (input == 'A') {
letter = new A();
} else {
// Default to B
letter = new B();
}
letter->PrintAlphabetPosition(); // Prints 1 or 2 as expected
delete letter;
}

我的问题是,有没有一种方法可以在不实例化a或B(甚至不是单例)的情况下执行main.cpp中的功能?我在这两个类中拥有的每一个函数都不会依赖于该类的特定实例。

我考虑过将A和B变成"静态"类,方法是将所有成员函数和变量声明为静态,然后将构造函数隐藏为私有,类似于这个问题的答案:如何在C++中创建静态类?。但是,静态声明将与虚拟声明冲突。

我还尝试将A和B变成抽象类,方法是将PrintAlphabetPosition()声明为纯虚拟函数,并将实现移动到它们各自的.cpp文件中。但是,在运行时,我如何能够在A::PrintAlphabetPosition()和B::PrintAlphabetPosition()之间进行动态选择?

EDIT:为了清楚起见,我应该提到类A和B作为实现Letter的实用程序类,它们有更多的功能。此外,我希望使用更多派生的Letter类(不仅仅是A和B)。

virtual函数不可能满足您的需求,因为这些函数本身就需要一个实例。

不过,您可以使用std::function变量,该变量是从类As或Bs的静态函数初始化的

class A {
public:
static void PrintAlphabetPosition();
};
class B {
public:
static void PrintAlphabetPosition();
};
void main() {
std::function<void()> letterFn;
char input;
std::cin >> input;
if (input == 'A') {
letterFn = A::PrintAlphabetPosition;
} else {
// Default to B
letterFn = B::PrintAlphabetPosition;
}
letterFn(); // Prints 1 or 2 as expected
}

如果函数不需要引用特定对象(如果您希望能够在不实例化任何东西的情况下调用它,则必须为true),则应该能够将其重写为静态方法。然后,您可以拨打A::PrintAlphabetPosition()B::PrintAlphabetPosition()来拨打您想要的电话。

如果您还想要一个虚拟方法,您也可以添加它,并让它调用类特定的静态方法。我认为您需要为虚拟方法和静态方法使用不同的名称。

相关内容

最新更新