我正在观看Google Tech Talks视频,他们经常提到多态性.
什么是多态,它是什么,以及它是如何使用的?
所以,我变得臭名昭着
未定义的引用'vtable ...
以下代码的错误(有问题的类是CGameModule.)我不能为我的生活理解问题所在.起初,我认为这与忘记给虚拟功能一个身体有关,但据我所知,一切都在这里.继承链有点长,但这里是相关的源代码.我不确定我应该提供哪些其他信息.
注意:构造函数是发生此错误的地方,看起来如此.
我的代码:
class CGameModule : public CDasherModule {
public:
CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)
: CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)
{
g_pLogger->Log("Inside game module constructor");
m_pInterface = pInterface;
}
virtual ~CGameModule() {};
std::string GetTypedTarget();
std::string GetUntypedTarget();
bool DecorateView(CDasherView *pView) {
//g_pLogger->Log("Decorating the view");
return false;
}
void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }
virtual void HandleEvent(Dasher::CEvent *pEvent);
private:
CDasherNode *pLastTypedNode;
CDasherNode *pNextTargetNode;
std::string m_sTargetString;
size_t m_stCurrentStringPos;
CDasherModel *m_pModel;
CDasherInterfaceBase …Run Code Online (Sandbox Code Playgroud) 我看过其他定义和解释,但没有一个能让我满意.我想知道是否有人可以在不使用任何代码或示例的情况下在最多两个句子中定义多态性.我不想听到'所以你有一个人/汽车/开罐器......'或者这个词是如何衍生出来的(没有人会对你知道poly和morph意味着什么感到印象深刻).如果你非常了解多态性是什么并且掌握了良好的英语能力,那么你应该能够在一个简短的,虽然密集的定义中回答这个问题.如果你的定义准确地定义了多态,但是如此密集以至于需要一些读取,那么这正是我正在寻找的.
为什么只有两句话?因为定义简短而且聪明.解释很长,包含示例和代码.在这里查看解释(这些页面上的答案对我的问题不满意):
我为什么问这个问题?因为我被问到同样的问题而且我发现我无法得出令人满意的定义(根据我的标准,这是非常高的).我想看看这个网站上是否有任何伟大的思想能够做到这一点.
如果你真的不能完成两句话的要求(这是一个难以定义的主题),那么如果你继续下去就没关系.我们的想法是有一个定义,它实际上定义了什么是多态,并没有解释它的作用或如何使用它(得到差异?).
如何以易于理解的方式描述多态?
我们可以在Internet和书籍上找到关于该主题的大量信息,例如Type polymorphism.但是,让我们尽可能地让它变得简单.
我是OOP的新手.虽然我理解多态性是什么,但我无法真正使用它.我可以使用不同名称的函数.我为什么要尝试在我的应用程序中实现多态性.
试图弄清楚PHP是否支持方法重载,继承和多态等功能,我发现:
但我不确定多态性.我发现这是谷歌搜索互联网:
我应该注意到,在PHP中,多态性并不是它应该的方式.我的意思是它确实有效,但由于我们的数据类型很弱,所以它不正确.
它真的是多态吗?
编辑
只是不能确定肯定是或旁边没有PHP supports polymorphism.我不愿意说:"PHP不支持多态",而实际上它确实如此.或相反亦然.
我试图将模板编程(以及在未来的某些方面,模板元编程)应用于现实世界的场景.我发现的一个问题是C++模板和多态并不总是按照我想要的方式一起玩.
我的问题是,我试图应用模板编程的方式是不正确的(我应该使用普通的旧OOP),或者我是否仍然坚持OOP思维模式.
在这种特殊情况下,我试图使用策略模式解决问题.我一直遇到这样的问题,我最终想要一些表现形式多样的模板似乎不支持.
OOP代码使用组成:
class Interpolator {
public:
Interpolator(ICacheStrategy* const c, IDataSource* const d);
Value GetValue(const double);
}
void main(...) {
Interpolator* i;
if(param==1)
i = new Interpolator(new InMemoryStrategy(...), new TextFileDataSource(...));
else if(param==2)
i = new Interpolator(new InMemoryStrategy(...), new OdbcDataSource(...));
else if(param==3)
i = new Interpolator(new NoCachingStrategy(...), new RestDataSource(...));
while(run) {
double input = WaitForRequest();
SendRequest( i->GetValue(input));
}
}
Run Code Online (Sandbox Code Playgroud)
潜在模板版本:
class Interpolator<class TCacheStrategy, class TDataSource> {
public:
Interpolator();
Value GetValue(const double); //may not be the best way but
void ConfigCache(const& …Run Code Online (Sandbox Code Playgroud) 这是C++中的一个简单代码:
#include <iostream>
#include <typeinfo>
template<typename T>
void function()
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
function<int>();
function<double>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经读过C++中的模板是一个编译时功能,它不像C#/ Java中的泛型.
据我所知,C++编译器会将单个定义的函数划分为不同的数字(取决于具有不同类型的调用计数)的函数.
我是对还是不对?我不是C++编译器的专家,所以我向你提出一些建议.
如果我对编译器输出的建议是正确的,我想知道我是否可以将上面的代码描述为静态多态?
因为它似乎没有覆盖,只是从可执行文件中调用副本或者......应用程序在输出二进制映像中的含义并不重要,但只有重要的部分是在C++代码级别而且我不看编译器如何产生输出.
n3035说:(2010-02-16)
变量由对象的声明引入.变量的名称表示对象.
n3090说:(2010-03-29)
通过声明除非静态数据成员或对象之外的引用引入变量.变量的名称表示引用或对象.
n3242说:(2011-02-28)
通过声明除非静态数据成员或对象之外的引用引入变量.变量的名称表示引用或对象.
任何人都可以在一个程序的帮助下解释这些差异(或者说是什么)
这是ISO标准C++的声明
我看到了这个链接:
但这不是(完全意义)我的问题......
我正在尝试找到一个解决方案,在模板类方法中有不变的数字文字.我正在制作一些与float或double类型一起使用的数学模板类.问题是文字因数据类型而异(例如浮点数为"0.5f",双数字为"0.5").到目前为止,我提出了两个解决方案.第一个假设代码:
template <typename T>
class SomeClass
{
public:
T doSomething(T x);
};
template <>
float SomeClass<float>::doSomething(float x)
{
float y = 0.5f;
/*
* Do computations...
*/
return x;
}
template <>
double SomeClass<double>::doSomething(double x)
{
double y = 0.5;
/*
* Do computations...
*/
return x;
}
Run Code Online (Sandbox Code Playgroud)
上面的方法强制为它使用的每种类型重写整个方法.
另一种方法:
template <typename T>
class SomeClass
{
public:
T doSomething(T x);
private:
T getValue();
};
template <typename T>
T SomeClass<T>::doSomething(T x)
{
T y = getValue();
/*
* Do computations...
*/ …Run Code Online (Sandbox Code Playgroud) oop ×6
c++ ×5
polymorphism ×5
templates ×3
c++11 ×1
function ×1
g++ ×1
gcc ×1
literals ×1
overriding ×1
php ×1
runtime ×1
terminology ×1