2015-07-11 7 views
-2

У меня проблема, и я не знаю, как начать ее решать. Я делаю это на C++.Как расширить класс, для которого у вас нет исходного кода?

Предположим, что у нас есть исполняемая программа (платформа UNIX), и мы можем запустить эту программу, набрав my_program. Параметры здесь 4 класса. Каждый из этих классов должен расширять класс, который написан в целевой программе (в my_program).

Итак, скажем, чем в моей_программе у нас есть классы A, B, C и D. Пользователь знает, что он должен расширять эти классы, поэтому он создает четыре дочерних класса.

class A1 : public A { ... } 
class B1 : public B { ... } 
class C1 : public C { ... } 
class D1 : public D { ... } 

Возможно ли это? классы A, B, C и D находятся в my_program, поэтому он может каким-то образом расширить их?

+0

Не наследуйте их классы, создайте совершенно новый, содержащий экземпляр своего класса. Состав над наследованием и все такое. –

+0

Вы имеете в виду вот так? 'class A1 { Переменная; } ' , а затем в программе я просто вызываю A.methodName? Actuly - это чистое решение: D и просто :) – golobich

+0

Возможно, вы можете загрузить исполняемый файл как общий объект, но это не очень хорошая идея. Просто создайте общий объект и сопроводительный заголовочный файл, и пусть my_program и программа пользователей загружают один и тот же общий объект. –

ответ

1

C++ не поддерживает этот тип наследования. Другие языки, такие как C#, допускают это.

Хотя вы можете написать этот вид производного класса, когда:

  • методы (особенно к т е р/Dector) из базового класса, экспортируемые из DLL или EXE;
  • У вас есть заголовок с определением базового класса;
  • Вы используете тот же компилятор и ту же версию компилятора, что и DLL.

В этом случае вы можете написать приложение, которое содержит производный класс. Это будет отдельный бинарный файл. Он загрузит DLL/EXE в свое адресное пространство и вызовет методы базового класса, когда это необходимо. Это возможно, потому что они должны быть экспортированы, поскольку это требуется в первом пуле.

+0

1) Предполагаю, что вы имеете в виду, что я создаю статическую библиотеку, а затем связываю эту библиотеку с этим исходным кодом? 2) Если у меня есть это в цель (my_program) 'Класс A { аннулируются method1() {осуществления} аннулируются method2() {реализации} }' тогда, если я даю пользователю файл заголовка, как это 'класс A { void method1(); void method2(); } '}, то он может расширить класс A, но если он назовет A.method1, будет ли этот метод вызова из моей цели (my_program?) – golobich

+0

Нет, мой ответ касается связанных бинарных файлов. Случай со статической библиотекой отличается. Вам нужна эта библиотека и заголовки. Ничего больше. –

+0

Хорошо, дайте мне посмотреть, правильно ли я это понял. Я должен экспортировать свой класс (и все его методы) в файл lib (.so) и создать заголовочный файл с моим определением классов (и методов) и предоставить его пользователю, чтобы он мог наследовать этот класс A? – golobich

Смежные вопросы