В моем C ++ проекте у меня есть абстрактный класс, который определяет интерфейс для DLL. Назовите это CAbstractClass.
У меня есть класс AClass, в котором определены функции для всех функций CAbstractClass, кроме 1. Как мне создать новый неабстрактный класс C для наследования CAbstractClass?
Вот моя попытка. Это приводит к ошибке ‘E0322: объект абстрактного класса типа «CClass» не допускается.
#include "stdafx.h"
class CAbstractClass
{
public:
CAbstractClass(void) {};
~CAbstractClass(void) {};
virtual int Fn1(int a) = 0;
virtual double Fn2(int a, int b) = 0;
virtual int Fn3(double a, double b) = 0;
};
class AClass
{
public:
AClass(void) {};
~AClass(void) {};
int Fn1(int a) { return 2 * a; }
double Fn2(int a, int b) { return (double)a / (double)b; }
};
class BClass
{
public:
BClass(void) {};
~BClass(void) {};
int Fn3(double a, double b) { return (int) (a+b); }
};
// My guess at how to combine all the classes.
class CClass : public CAbstractClass, public AClass, public BClass
{
public:
CClass(void) {};
~CClass(void) {};
};int main()
{
CClass C; // E0322: object of abstract class type "CClass" is not allowed.return 0;
}
AClass
а также BClass
также должны наследовать от CAbstractClass
, Fn1, Fn2 и Fn3 просто не реализуют виртуальные методы абстрактного класса, поэтому CClass
также абстрактно
class AClass : public CAbstractClass {
//...
};
class BClass : public CAbstractClass {
//...
};
class CClass : public virtual AClass, public virtual BClass {
//...
};
Я не уверен, что это можно сделать с помощью одного CAbstractClass, но если вы разделите свой абстрактный интерфейс на два отдельных абстрактных интерфейса, то это достаточно просто:
#include <stdio.h>
class CAbstractClassA
{
public:
virtual int Fn1(int a) = 0;
virtual double Fn2(int a, int b) = 0;
};
class CAbstractClassB
{
public:
virtual int Fn3(double a, double b) = 0;
};
class AClass : public CAbstractClassA
{
public:
int Fn1(int a) { return 2 * a; }
double Fn2(int a, int b) { return (double)a / (double)b; }
};
class BClass : public CAbstractClassB
{
public:
int Fn3(double a, double b) { return (int) (a+b); }
};
// My guess at how to combine all the classes.
class CClass : public AClass, public BClass
{
public:
};
int main()
{
CClass C;
printf("Fn1(5) returns %i\n", C.Fn1(5));
printf("Fn2(10,12) returns %f\n", C.Fn2(10,12));
printf("Fn3(3.14,6.28) returns %i\n", C.Fn3(3.14,6.28));
return 0;
}
Вот что я в итоге использовал. Я выбрал его, потому что он оставляет AClass в покое. Есть еще работа: каждая функция-член, которая приходит из AClass, должна быть определена в BClass. Еще одним преимуществом является то, что нет необходимости в CClass.
#include "stdafx.h"
class BAbstractClass
{
public:
BAbstractClass(void) {};
~BAbstractClass(void) {};
virtual int Fn1(int a) = 0;
virtual double Fn2(int a, int b) = 0;
virtual int Fn3(double a, double b) = 0;
};
class AClass
{
public:
AClass(void) {};
~AClass(void) {};
int Fn1(int a) { return 2 * a; }
double Fn2(int a, int b) { return (double)a / (double)b; }
};class BClass : public AClass, public BAbstractClass
{
public:
BClass(void) {};
~BClass(void) {};
int Fn3(double a, double b) { return (int)(a + b); }
// Define a function for each of AClass' member functions.
int Fn1(int a) { return AClass::Fn1(a); }
double Fn2(int a, int b) { return AClass::Fn2(a, b); }
};int main()
{
BClass B;
return 0;
}