虽然我已经在c ++工作了一段时间,但直到现在我还没有必要使用多态功能,而且我对它们非常感兴趣.
如果我有一个基类ClassA而另一个ClassB派生自它,我理解我可以拥有virtual成员函数ClassA,当实现时ClassB,ClassB即使该实例指向使用ClassA指针,也会在实例中调用它.如果没有这个virtual关键字,我假设基类实现在使用基类指针时会占上风,但是对从子类实例化的对象进行操作,如果事实上ClassB它有自己的相同函数的实现,那对我来说似乎有问题.在这种情况下被有效地忽略了.
这是对多态行为的正确理解吗?
现在真正的问题是你如何引用ClassB指针是基类.我真的只能想到两种方式:
static_cast并转换对象并将其指定给指向基类的指针.这些是生成基类对象的基类指针的两种主要技术吗?
我发现多态性和重载有很多定义。
有人说重载是多态的一种。虽然有人说他们不一样。因为重载时只会分配一个函数。而多态性需要为每个重新定义的成员函数分配内存。我真的对此感到困惑。这对我来说有什么解释?
此外,重载是否发生在编译时,而多态性发生在运行时?
我对OOP概念有愚蠢的问题,我们选择多态的原因是什么?
C++中的简单代码:
class Shape{
public:
virtual void draw(){ cout<<"Shape"<<endl;};
};
class Traingle: public Shape
{
public: void draw(){cout<<"Triangle"<<endl;}
};
class Rectangle: public Shape
{
public: void draw (){cout<<"Rectangle"<<endl;}
};
int main(){
Shape *ptr= new Traingle();
ptr->draw();
delete ptr;
return 7;
}
Run Code Online (Sandbox Code Playgroud)
这里ptr-> draw()函数会调用Triangle绘制,如果指向Rectangle然后是Rectangle draw,这是后期绑定.
创建Base类指针并将其指向不同类的必要性是什么?我们可以创建单独的类对象而不需要任何虚函数,并且可以调用whicever.喜欢
int main(){
Traingle tObj;
tObj->draw();
Rectangle rObj;
rObj->draw();
}
Run Code Online (Sandbox Code Playgroud)
基本上做同样的事情;
为什么多态基本上?为什么虚拟?
它有什么需要或者使用这个属性有什么区别?真实案例会有所帮助!!
我的问题,在最后一段,需要(在我看来)一些解释性设置.基本上,我想知道你是否可以避免使用模板而不是你创建所有你想成为的模板类而是从一个声明你将要使用的虚方法的基类继承,其中包括一个内存分配函数,当实现时,将返回指向派生(非基础)类型的指针.
C++似乎没有"通用基类"的概念,一切都是隐式派生的; 我想这个类定义如下:
class universal_base
{
};
Run Code Online (Sandbox Code Playgroud)
当然,现在我已经定义了它,我可以让我的所有类都来自它.然后,由于多态性,universal_base我传递的任何引用或指针将与模板参数基本相同:
template <typename T>
class C
{
T &x;
int f(T &y);
C(T &z): x(z + 1) {}
};
class C
{
universal_base &x;
int f(universal_base &y);
C(universal_base &z): x(z + 1) {}
};
Run Code Online (Sandbox Code Playgroud)
不同之处在于,在第一种结构中,表达式z + 1不能保证有效; 你只需告诉用户T必须超载operator+.在第二个结构中,我可以添加一个虚拟的运算符universal_base:
// in universal_base
public:
virtual universal_base& operator+(const universal_base &x) = 0;
Run Code Online (Sandbox Code Playgroud)
并使用typeid和dynamic_cast在实现中使争论正确.这样,编写格式错误的代码是不可能的,因为如果你没有实现,编译器会抱怨operator+.
当然,这样就无法声明非引用类型的成员:
class C: public universal_base
{ …Run Code Online (Sandbox Code Playgroud)
我在这里有点困惑.如果我们可以实例化一个类的对象并访问成员方法那么为什么指向一个类的指针?它有什么好处吗?我们何时使用指向类的指针,何时实例化它的对象?
谢谢.
我创建了一些代码来重现问题:
#include "stdafx.h"
#include <iostream>
#include <vector>
class A
{
protected:
int m_X;
public:
A() {
std::cout << "in A ctor" << std::endl;
m_X = 0;
}
virtual void printX(){ std::cout << "in A " << m_X << std::endl; }
};
class B : public A
{
public:
B() {
std::cout << "in B ctor" << std::endl;
m_X = 1;
}
virtual void printX(){ std::cout << "in B " << m_X << std::endl; }
};
class As
{
public:
void …Run Code Online (Sandbox Code Playgroud) 我是C++的这些重要功能的新手,我已经在这里阅读了一些关于这些主题的问题/答案,并搜索了一些文档.但我仍然对此感到困惑......
如果有人可以建议我一些好的在线教程或书籍章节,这将很容易和慢,并从基本开始它将是伟大的.
此外,如果有人知道一些很好的现有运动材料.
Let's say I have a Human class:
class Human {
public:
bool isFemale;
double height;
Human(bool isFemale, double height) {
this->isFemale = isFemale;
this->height = height;
}
};
Run Code Online (Sandbox Code Playgroud)
and derived classes, such as Female and Male, which implement their own methods. Do I have a way, in C++11, to determine at runtime, depending on the inputs into the Human constructor, which "sub-type" (Male or Female) Human should be? I am putting different behaviour for Male and Female in their respective …
我非常需要这个问题的答案 - 使用代码示例的泛型和多态之间的差异.我知道它相关的编译时间或绑定的东西,但我不确定..请帮助