当前位置: 首页 > 知识库问答 >
问题:

我以为指针只能指向同一个类/数据类型?

阎弘
2023-03-14

我以为我知道指针,但当我研究运行时多态性/动态绑定时,我看到了指针的一种非常不同的用法。下面是我的3个问题,它们都是关于下面的单行代码的:

#include <iostream>
class Base {
    public:
    virtual void fun (int x) { std::cout << "base" << std::endl; }
};

class Derived : public Base {
    public:
    void fun (int x) { std::cout << "base" << std::endl; }
};

int main() {

    //--------------------------------------
    //1. Pointer can only hold memory address, 'Derived()' is calling the default constructor it is not a memory address
    //2. What's the point of putting this into heap?
    //3. I thought pointers could only hold memory address of the same datatype/class
    Base* obj = new Derived();
    //--------------------------------------

    obj->fun(5);
    return 0;
}    

共有1个答案

蔺德曜
2023-03-14
  1. 指针只能保存内存地址,'derived()'正在调用默认构造函数它不是内存地址

这里的表达式不是Derived()(这确实会构造一个临时对象),而是new Derived(),这是new的特定语法,用于分配和构造具有动态生存期的对象,并返回指向该对象的指针。请注意,用于结束对象生存期的相应delete缺失,但请参阅下一点。

没有。特别是,对象的生存期不会影响指针的使用,多态性也不需要指针(引用也一样)。在任何情况下,动态分配都应该使用智能指针来完成,而不是裸的news。

这仍然是正确的:obj指向的是derived对象的base子对象。C++提供了从派生*基*(以及派生&基&)的隐式指针调整转换,以方便多态性的使用。

 类似资料:
  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • 所以我的教授喜欢用我们应该弄清楚的论文上的代码来测试我们。我不会发布代码,因为我不是在寻找答案,这只是他曾经让我们感到困惑的一件事是,当他初始化一个类的对象,然后初始化另一个类的指针指向上述对象时。它让我感到困惑,这是一个如此具体的问题,我不知道如何搜索它。例: “d- 当指针来自一个类却指向另一个类的对象时,它到底在做什么?我知道这个问题以前可能已经被回答过了,但是我在任何地方都找不到它,所以我

  • 问题内容: 谁能告诉我为什么无法编译? 到目前为止,我的推理是这样。Golang中的所有类型都不同,但是只要基础类型相同,它就可以使用类似C的转换语法将一种类型转换为另一种类型。在我的示例中,将“ int”转换为“ myint”不是问题。’ int’到’ myint’也不是。当您有指针问题出现时。我已经坚持了第二天。任何帮助表示赞赏。 问题答案: 这是我的分析。 -无法将()转换为: 和是未命名的

  • 查看如下程序:nexter是一个接口类型,并且定义了一个next()方法读取下一字节。函数nextFew将nexter接口作为参数并读取接下来的num个字节,并返回一个切片:这是正确做法。但是nextFew2使用一个指向nexter接口类型的指针作为参数传递给函数:当使用next()函数时,系统会给出一个编译错误:*n.next undefined (type nexter has no fiel

  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = &pi; 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType