0

来自 Java/C# 背景,需要一些帮助来理解 C++ 中发生的事情......

class A {
   int x;
   public:
   A(int x) : x(x){}

   void f(int y) {
     cout << x + y << endl;
   }
};

class B : virtual A {
    int x;
    public:
    B(int x) : A(2*x), x(x) {}
    virtual void f(int y){
        cout << x + 2*y << endl;
    }
};

void h(){
    B b(5);
    A &a = dynamic_cast<A &>(b);
    a.f(10);
    b.f
}

void g() {
    A *a = this;
    a->f(10);
    B *b = dynamic_cast<B *>(a);
    b->f(10);
 }

调用 h() 可以,但调用 g() 将不起作用。有人可以解释为什么吗?另外,在 A(int x) : x(x){} 行中 : x(x){} 做什么?B(int x) 的相同问题:A(2*x)、x(x) 和:A(2*x)、x(x)。

非常感谢您的帮助。

4

4 回答 4

2

A(int x) : x(x){} : x(x){} 做什么?

: x(x)是初始化列表。括号中的变量是接收到的参数,而外部的是成员变量。这意味着成员变量使用接收到x的参数的值进行初始化x

B(int x) : A(2*x)

A在这里,您正在调用接收整数的基类构造函数(即)。x是构造函数接收到的变量B。这是一种从派生类构造函数调用参数化基类构造函数的方法。默认情况下,派生类构造函数调用默认的基类构造函数。在您的情况下,如果您不提供A(2*x)它会失败,因为基类没有默认构造函数。

于 2013-07-31T15:11:03.157 回答
1

1) As per MSDN (responding to your question related to g());

The this pointer is a pointer accessible only within the nonstatic member functions of a class, struct, or union type. It points to the object for which the member function is called. Static member functions do not have a this pointer.

2) The A(int y) : x(y) {} initializes A::x (the member before () with the value inside the "()" i.e. y (modified variable names for better understanding). Same is the case as with B(int x) : A(2*x), x(x) {}. It calls the base class's (A) constructor with the parameter 2*x and then initializes B::x with the value inside the (), i.e. x.

3) Also, g() wouldn't work because the dynamic_cast<> would throw a compile error since the object that's being casted needs to have at least 1 virtual function. If the only virtual function would be the destructor, then dynamic_cast<> would work.

于 2013-07-31T15:49:07.157 回答
1

g()只是一个自由函数而不是类的成员,所以this没有意义。我不确定你想在那里做什么

关于:

A(int x): x(x)

你的A班级有int x成员。x这是使用传递给构造函数的值调用该整数的构造函数A。在我看来,这是不好的风格,你应该区分两者。例如

class A {
   int x;
   public:
   A(int x_in) : x(x_in){}

   //...
};

这相当于

class A {
       int x;
       public:
       A(int x_in)  {
           x = x_in;
       }
       //...
    };
于 2013-07-31T15:10:05.173 回答
0

g是文件范围内的函数,也就是它不属于任何类。因此,您不能使用this.

-: x(x)风格的表达式是成员构造函数——它们初始化(即调用构造函数)类的成员。

于 2013-07-31T15:09:26.453 回答